Maison > développement back-end > tutoriel php > Comment échapper aux caractères génériques MySQL pour les requêtes SQL sécurisées ?

Comment échapper aux caractères génériques MySQL pour les requêtes SQL sécurisées ?

Barbara Streisand
Libérer: 2024-11-09 10:03:02
original
243 Les gens l'ont consulté

How to Escape MySQL Wildcards for Secure SQL Queries?

É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 " '
Copier après la connexion

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 :

  1. L'échappement LIKE : _ et % sont spéciaux et doivent être échappés. Le caractère d'échappement () doit également être échappé.
  2. Échappement littéral de chaîne : Après l'échappement de LIKE, effectuez un échappement littéral de chaîne simple en utilisant mysql_real_escape_string ( pour MySQL) ou la fonction appropriée pour d'autres bases de données.

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);
}
Copier après la connexion

Ensuite , utilisez-le comme suit :

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal