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>
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 à :
mysql_set_charset()
ou du paramètre de jeu de caractères DSN de PDO. 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!