Échapper aux caractères génériques MySQL : comprendre l'énigme du double échappement
Lorsque vous travaillez avec une saisie utilisateur en PHP et que vous vous connectez à une base de données MySQL, vous échappez à des caractères est crucial pour empêcher les entrées malveillantes. Traditionnellement, la fonction mysql_real_escape_string() de PHP a été utilisée à cette fin, mais il lui manque des caractères comme % et _, qui sont des caractères génériques dans MySQL. En conséquence, de nombreux développeurs ont également recours à des addcslashes pour échapper à ces caractères.
Cependant, le comportement inattendu des addcslashes soulève des questions. Pourquoi s'échappe-t-il _ avec une barre oblique inverse mais pas " ou ' ? Dans cet article, nous allons approfondir les nuances de l'échappement des caractères génériques MySQL et explorer une solution pour les gérer correctement.
Comprendre LIKE Échapper
Contrairement aux autres caractères génériques, % et _ ne sont pas des caractères génériques dans les littéraux de chaîne MySQL standard. Ils deviennent des caractères spéciaux uniquement dans le contexte de la correspondance LIKE, où ils indiquent la correspondance des caractères génériques pour préparer les chaînes pour LIKE. utilisation, une couche supplémentaire d'échappement, connue sous le nom d'échappement LIKE, est requise, même avec des requêtes paramétrées.
Dans l'échappement LIKE, _ et % doivent être échappés, ainsi que le caractère d'échappement lui-même (généralement la barre oblique inverse). Cependant, contrairement au SQL standard, MySQL utilise une barre oblique inverse pour les échappements de barre oblique inverse littéraux (dans les chaînes littérales) et pour l'échappement LIKE.
Le double échappement et le problème des barres obliques inverses
Cette double utilisation des barres obliques inverses crée un scénario de double échappement déroutant. Pour faire correspondre un signe de pourcentage littéral (%), par exemple, vous devrez l'échapper avec une double barre oblique inverse en utilisant LIKE 'quelque chose\%'. Cependant, cela est incorrect selon ANSI SQL, et selon la base de données, vous pouvez rencontrer des problèmes.
Une solution portable
Pour résoudre ce problème et assurer la portabilité, vous devez remplacer le caractère d'échappement par défaut dans les expressions LIKE à l'aide de la construction LIKE ... ESCAPE .... Voici une fonction présentant cette approche :
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Avec cette fonction, vous pouvez échapper des chaînes pour une utilisation LIKE tout en garantissant la compatibilité ANSI SQL.
Conclusion
Bien qu'échapper aux caractères génériques dans MySQL puisse sembler simple, l'énigme de la double évasion peut prêter à confusion. En comprenant les subtilités de l'évasion de LIKE et en utilisant une solution portable, vous pouvez empêcher efficacement les entrées malveillantes et garantir l'intégrité de votre base de données.
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!