Dans un environnement où les instructions préparées ne sont pas une option, il est essentiel d'échapper complètement aux entrées de l'utilisateur avant de les soumettre à MySQL pour empêcher l'injection SQL. La fonction mysql_real_escape_string de PHP est couramment utilisée à cette fin, mais elle ne parvient pas à échapper aux caractères génériques MySQL '%' et '_'.
Pour tenir compte de cela, des addcslashes peuvent être utilisés en plus. Cependant, comme l'a observé un utilisateur, lorsqu'une entrée contenant des caractères génériques est envoyée à la base de données et récupérée, il y a une divergence dans les résultats affichés.
L'énigme qui s'échappe
L'utilisateur a rencontré un comportement particulier où le caractère '_' était préfixé par une barre oblique inverse ('_'), alors que les caractères '"' et "'" ne l'étaient pas, même si tous trois ont été échappés avec ''. Cela soulève la question : pourquoi ces caractères sont-ils traités différemment ?
Comprendre le contexte MySQL
La clé pour résoudre cette énigme réside dans la compréhension du contexte de correspondance LIKE dans MySQL. '_' et '%' ne sont pas considérés comme des caractères génériques dans l'utilisation générale de MySQL et ne doivent pas être échappés lors de la construction d'une chaîne littérale. mysql_real_escape_string répond aux besoins d'échappement à cet effet.
Cependant, lors de la préparation de chaînes à utiliser dans une instruction LIKE, un ensemble différent de règles d'échappement s'applique pour garantir que les littéraux sont interprétés correctement, un échappement LIKE supplémentaire est requis.
Dilemme de la double évasion
Dans le Dans le contexte de la correspondance LIKE, '_' et '%' deviennent des caractères spéciaux. MySQL utilise la barre oblique inverse ('') comme caractère d'échappement pour les étapes d'échappement LIKE et d'échappement littéral de chaîne. Cela peut prêter à confusion, comme le démontre l'exemple de l'utilisateur où la correspondance d'un signe de pourcentage littéral avec LIKE nécessite un échappement à double barre oblique inverse.
Échappement LIKE approprié
Pour éviter la portabilité problèmes, ANSI SQL impose l'utilisation d'un caractère d'échappement désigné pour les instructions LIKE. Une façon d'y parvenir en PHP est d'utiliser la fonction suivante :
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Utilisation avec des instructions préparées
Pour plus de sécurité et de portabilité, il est conseillé d'utiliser des instructions préparées. déclarations lorsqu’elles sont disponibles. Cela élimine le besoin d'échappement manuel tout en garantissant une gestion appropriée des 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!