Maison >base de données >tutoriel mysql >Comment puis-je échapper en toute sécurité aux caractères spéciaux MySQL, y compris les caractères génériques, pour l'insertion dans une base de données ?

Comment puis-je échapper en toute sécurité aux caractères spéciaux MySQL, y compris les caractères génériques, pour l'insertion dans une base de données ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 07:11:11663parcourir

How Can I Safely Escape MySQL Special Characters, Including Wildcards, for Database Insertion?

É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 :

  1. LIKE Escaping : Dans les instructions LIKE, _ et % doivent être échappé, avec le caractère d'échappement. Le caractère d'échappement lui-même doit également être échappé.
  2. Échappement littéral de chaîne : Après l'échappement LIKE, les chaînes doivent subir un échappement littéral de chaîne régulier en fonction des exigences spécifiques de la base de données. Pour MySQL, cela se fait à l'aide de mysql_real_escape_string.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn