Mysql
 sql >> Database >  >> RDS >> Mysql

PHP Qual è il set di caratteri predefinito per pdo mysql

L'opzione character_set_client è ciò che MySQL utilizza per il set di caratteri delle query e dei dati inviati dal client.

L'impostazione predefinita è utf8 in MySQL 5.5, 5.6 e 5.7 e utf8mb4 in 8.0.

Può anche essere modificato a livello globale nel file delle opzioni my.cnf o per sessione tramite un IMPOSTA NOMI dichiarazione.

È bene impostare l'opzione in modo esplicito quando ti connetti, in modo da non dover assumere il suo valore predefinito.

Re il tuo commento:

Temo che tu stia confondendo due diversi casi di SQL injection. Esiste un rischio quando si utilizzano quei set di cinque caratteri specifici, ma non è correlato all'iniezione SQL di secondo ordine.

Il rischio del set di caratteri è dovuto ad alcuni set di caratteri multibyte. È comune inserire una barra rovesciata per evitare un carattere di virgolette letterale. Ma in alcuni set di caratteri, il byte barra rovesciata viene unito al byte precedente, formando un carattere multibyte. Ciò lascia la citazione senza escape.

L'iniezione SQL del secondo ordine è completamente diversa. Può verificarsi con qualsiasi set di caratteri. Questo è quando un utente malintenzionato aggiunge dati al tuo database con mezzi legittimi, come la compilazione di un modulo. L'inserimento dei dati viene gestito senza errori. Ma i valori che inseriscono contengono una sintassi progettata per sfruttare alcune query SQL successive.

Si basa sugli sviluppatori che credono che i dati che sono già stati salvati in modo sicuro nel loro database siano in qualche modo "sicuri" per l'uso senza un'adeguata parametrizzazione.

Un esempio di SQL injection di secondo ordine che è semplicemente accidentale invece che dannosa potrebbe essere che una persona ha il cognome "O'Reilly" e il nome viene letto dal codice e utilizzato in una query successiva.

$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";

Se il nome contiene un apostrofo letterale, rovinerebbe la seconda query in quell'esempio.