mysql_real_escape_string
(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
Avertissement
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 :
Description
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.
Attention
Securité : le jeu de caractères par défaut
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.
Liste de paramètres
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.
Valeurs de retour
Retourne la chaîne échappée, ou false si une erreur survient.
Erreurs / Exceptions
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.
Exemples
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.
Notes
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, et false sera
retourné. Si link_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 avec LIKE, GRANT,
ou REVOKE.