Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP Quel est le jeu de caractères par défaut pour pdo mysql

L'option character_set_client est ce que MySQL utilise pour le jeu de caractères des requêtes et des données que le client envoie.

La valeur par défaut est utf8 dans MySQL 5.5, 5.6 et 5.7, et utf8mb4 dans 8.0.

Il peut également être modifié globalement dans votre fichier d'options my.cnf, ou par session par un DÉFINIR DES NOMS déclaration.

Il est bon de définir explicitement l'option lorsque vous vous connectez, afin que vous n'ayez pas à assumer sa valeur par défaut.

Concernant votre commentaire :

Je crains que vous ne confondiez deux cas différents d'injection SQL. Il existe un risque lors de l'utilisation de ces cinq jeux de caractères spécifiques, mais cela n'est pas lié à l'injection SQL de second ordre.

Le risque lié au jeu de caractères est dû à certains jeux de caractères multi-octets. Il est courant d'insérer une barre oblique inverse pour échapper un guillemet littéral. Mais dans certains jeux de caractères, l'octet antislash est fusionné avec l'octet précédent, formant un caractère multi-octets. Cela laisse la citation sans échappement.

L'injection SQL de second ordre est totalement différente. Cela peut se produire avec n'importe quel jeu de caractères. C'est lorsqu'un attaquant ajoute des données à votre base de données par des moyens légitimes, comme remplir un formulaire. L'insertion des données s'effectue sans erreur. Mais les valeurs qu'ils insèrent contiennent une syntaxe conçue pour exploiter une requête SQL ultérieure.

Cela repose sur le fait que les développeurs croient que les données qui ont déjà été enregistrées en toute sécurité dans leur base de données sont en quelque sorte "sûres" pour une utilisation sans paramétrage approprié.

Un exemple d'injection SQL de second ordre simplement accidentelle plutôt que malveillante pourrait être qu'une personne porte le nom de famille "O'Reilly", et que le nom soit lu par le code et utilisé dans une requête ultérieure.

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

Si le nom contient une apostrophe littérale, cela gâcherait la deuxième requête de cet exemple.