(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — Protège une commande SQL de la présence de caractères spéciaux
Cette extension était obsolète en PHP 5.5.0, et a été supprimée en PHP 7.0.0. À la place, vous pouvez utiliser l'extension MySQLi ou l'extension PDO_MySQL. Voir aussi MySQL : choisir une API du guide. Alternatives à cette fonction :
$unescaped_string
, resource $link_identifier
= NULL): string
mysql_real_escape_string() protège une commande SQL
de la chaîne unescaped_string
, en "échappant" les caractères
spéciaux tout en prenant en compte le jeu de caractères courant de la connexion link_identifier
.
Le résultat peut être utilisé sans problème avec la fonction mysql_query().
Si des données binaires doivent être insérées, cette fonction doit être utilisée.
mysql_real_escape_string() appelle la fonction
mysql_escape_string()
de la bibliothèque MySQL qui ajoute un antislash aux caractères suivants :
NULL
, \x00
, \n
,
\r
, \
, '
,
"
et \x1a
.
Cette fonction doit toujours (avec quelques exceptions) être utilisée avant d'envoyer la requête à MySQL afin de protéger vos données d'injection de caractères pouvant dévoyer cette requête.
Le jeu de caractèrs doit être défini soit au niveau serveur, soit avec la fonction API mysql_set_charset() pour qu'il ait un effet sur la fonction mysql_real_escape_string(). Voir la section sur les concepts on des jeux de caractères pour plus d'informations.
unescaped_string
La chaîne à échapper.
link_identifier
La connexion MySQL.
S'il n'est pas spécifié, la dernière connexion ouverte avec la fonction
mysql_connect() sera utilisée. Si une telle connexion
n'est pas trouvée, la fonction tentera d'ouvrir une connexion, comme
si la fonction mysql_connect() avait été appelée sans argument.
Si aucune connexion n'est trouvée ou établie, une alerte de niveau
E_WARNING
sera générée.
Retourne la chaîne échappée, ou false
si une erreur survient.
Exécuter cette fonction sans qu'une connexion MySQL ne soit présente
va également émettre une erreur PHP de niveau E_WARNING
.
N'exécuter cette fonction qu'avec une connexion MySQL valide.
Exemple #1 Exemple simple avec mysql_real_escape_string()
<?php
// Connexion
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Requête
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
Exemple #2 Exemple avec mysql_real_escape_string() et la nécessité de la présence d'une connexion
Cet exemple démonte ce qui survient si une connexion MySQL n'est pas présente lors de l'appel à la fonction.
<?php
// Nous n'avons pas de connexion MySQL
$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
Résultat de l'exemple ci-dessus est similaire à :
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5 Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5 bool(false) string(41) "SELECT * FROM actors WHERE last_name = ''"
Exemple #3 Un exemple d'attaque par injection SQL
<?php
// Nous ne vérifions pas $_POST['password'], il peut contenir ce que l'utilisateur veut ! Par exemple :
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Demande à la base de vérifier si un utilisateur correspond
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// Cela signifie que la requête envoyée à MySQL sera :
echo $query;
?>
La requête envoyée à MySQL :
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Cela permet à n'importe qui de s'identifier sans mot de passe valide.
Note:
Une connexion MySQL est nécessaire avant d'utiliser la fonction mysql_real_escape_string(), sinon, une erreur de niveau
E_WARNING
sera générée, etfalse
sera retourné. Silink_identifier
n'est pas défini, la dernière connexion MySQL est utilisée.
Note:
Si cette fonction n'est pas utilisée pour protéger vos données, la requête sera vulnérable aux attaques par injection SQL.
Note: mysql_real_escape_string() n'échappe ni
%
, ni_
. Ce sont des jokers en MySQL si combinés avecLIKE
,GRANT
, ouREVOKE
.