Maison > base de données > tutoriel mysql > Le contournement de l'injection SQL peut-il `mysql_real_escape_string ()` dans des conditions de jeu de caractères spécifiques?

Le contournement de l'injection SQL peut-il `mysql_real_escape_string ()` dans des conditions de jeu de caractères spécifiques?

Susan Sarandon
Libérer: 2025-01-25 21:31:10
original
633 Les gens l'ont consulté

Can SQL Injection Bypass `mysql_real_escape_string()` Under Specific Character Set Conditions?

Injection SQL qui contourne mysql_real_escape_string() dans certaines circonstances

Bien que mysql_real_escape_string() soit généralement considéré comme éliminant les vulnérabilités d'injection SQL, il peut toujours être contourné dans certains cas particuliers.

Analyse de vulnérabilité

Dans certains scénarios, un attaquant peut exploiter une faille dans mysql_real_escape_string() qui se produit lorsque le jeu de caractères de la connexion à la base de données est choisi pour prendre en charge à la fois les caractères ASCII' et '(par exemple, gbk, sjks).

Un attaquant peut construire une charge utile contenant une séquence de caractères multi-octets non valide (par exemple, xbfx27), qui, lorsqu'elle est traitée via mysql_real_escape_string(), aboutit à un caractère ' non échappé. Par conséquent, lorsqu’il est inséré dans une requête, il entraîne une injection SQL.

Exemple

Considérez le code PHP suivant :

<code class="language-php">$login = mysql_real_escape_string($_POST['login']);
$password = mysql_real_escape_string($_POST['password']);

$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";</code>
Copier après la connexion

Si un attaquant définit la valeur de $_POST['login'] sur \xbf\x27 OR 1=1 /*, il peut contourner la protection de mysql_real_escape_string() et récupérer toutes les lignes de la table.

Mesures d'atténuation

Pour atténuer cette vulnérabilité, veillez à :

  • Mise à niveau vers une version plus récente de MySQL : Les versions plus récentes de MySQL (par exemple, MySQL 5.1) contiennent un correctif pour ce problème spécifique.
  • Utilisez un jeu de caractères sécurisé : Utilisez un jeu de caractères qui ne prend pas en charge ' et ' comme caractère valide (par exemple, utf8, latin1).
  • Désactivez les instructions préparées émulées dans PDO : Définissez PDO::ATTR_EMULATE_PREPARES sur false pour forcer l'utilisation de véritables instructions préparées.
  • Définissez correctement le jeu de caractères : Définissez explicitement le jeu de caractères de la connexion à la base de données à l'aide de mysql_set_charset() ou du paramètre de jeu de caractères DSN de PDO.
  • Utiliser le mode SQL 'NO_BACKSLASH_ESCAPES' (à utiliser avec prudence) : Ce mode SQL atténue cette vulnérabilité spécifique en empêchant la création de caractères valides lors de l'échappement. Soyez toutefois conscient des effets secondaires potentiels.

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