Échapper aux caractères génériques MySQL : un guide complet
Lorsque vous traitez des entrées utilisateur non fiables dans un environnement MySQL, il est crucial d'échapper aux caractères spéciaux pour empêcher les attaques par injection SQL. La fonction PHP mysql_real_escape_string est couramment utilisée à cet effet. Cependant, il n'échappe pas aux caractères génériques MySQL "%" et "_".
Pour résoudre ce problème, certains utilisateurs ont recours à des addcslashes pour échapper manuellement à ces caractères génériques. Cependant, cette approche peut conduire à des résultats inattendus, comme le montre l'exemple fourni :
Input: test_test " ' Database: test\_test " '
Ici, le trait de soulignement ("_") est précédé d'une barre oblique inverse, contrairement au guillemet simple ("'" ) et guillemets ("""). Ce comportement peut prêter à confusion puisque tous ces caractères sont échappés à l'aide du caractère barre oblique inverse.
Comprendre ce phénomène nécessite d'approfondir les mécanismes d'échappement des caractères génériques de MySQL. "_" et "% " ne sont pas traité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 de chaînes littérales normales. mysql_real_escape_string gère correctement cette situation.
Cependant, "%_" ne devient un caractère spécial que dans le contexte d'une correspondance LIKE. . Pour préparer des chaînes pour une utilisation littérale dans les instructions LIKE, vous devez effectuer un échappement LIKE même lorsque vous utilisez des requêtes paramétrées.
L'échappement LIKE implique deux niveaux :
Le potentiel d'échappement à double barre oblique inverse peut être problématique, surtout si vous utilisez les chaînes littérales de PHP, comme démontré dans l'exemple.
Pour éviter ces complexités et garantir la portabilité, envisagez de remplacer le comportement d'échappement LIKE par défaut (incorrect) et de spécifier un caractère d'échappement personnalisé à l'aide de la construction LIKE ... ESCAPE ... :
// function that performs LIKE escaping function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Ensuite , utilisez-le comme suit :
$escapedname = mysql_real_escape_string(like($name, '=')); $query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
En suivant ces recommandations, vous pouvez efficacement échapper aux caractères génériques MySQL et améliorer la sécurité de vos applications de 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!