Échapper aux caractères spéciaux MySQL pour l'insertion d'une base de données
Lors de l'insertion d'une entrée utilisateur dans une base de données MySQL, il est crucial d'éviter les vulnérabilités potentielles en échappant correctement personnages. La fonction PHP mysql_real_escape_string gère efficacement cette tâche, mais elle n'échappe pas aux caractères génériques MySQL % et _.
Pour résoudre ce problème, de nombreux développeurs utilisent également la fonction addcslashes en conjonction avec mysql_real_escape_string pour échapper à ces caractères génériques. Cependant, cette approche peut conduire à des résultats inattendus.
Comprendre l'échappement des caractères génériques dans MySQL
Contrairement à la croyance populaire, _ et % ne sont pas considérés comme des caractères génériques dans MySQL pour une chaîne générale littéraux. Ils ne doivent être échappés que lorsqu'ils sont utilisés dans des instructions LIKE pour la correspondance de modèles.
La hiérarchie des échappements
L'échappement de caractères spéciaux dans le contexte des instructions LIKE implique deux niveaux :
La confusion avec les doubles barres obliques inverses
MySQL utilise le caractère barre oblique inverse comme caractère d'échappement pour l'échappement LIKE et la chaîne. s'échapper littéralement. Cela peut prêter à confusion, comme on le voit lors de l'insertion d'une chaîne contenant %. Des doubles barres obliques inverses doivent être utilisées pour l'échapper à des fins LIKE, puis la chaîne dans son ensemble doit être à nouveau échappée pour l'insertion littérale de chaîne.
ANSI SQL et échappement LIKE portable
ANSI SQL définit que les barres obliques inverses dans les chaînes littérales représentent des barres obliques inverses littérales et que les guillemets simples sont échappés à l'aide de ''. Cependant, MySQL s'écarte de cette norme. Pour garantir la portabilité, il est recommandé de remplacer le comportement par défaut de MySQL et de spécifier un caractère d'échappement personnalisé à l'aide de la construction LIKE ... ESCAPE .... Par exemple :
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); } $escapedname = mysql_real_escape_string(like($name, '=')); $query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!