(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
Alternatives suggérées
L'utilisation de cette extension est déconseillée. A la place, l'extension MySQLi ou PDO_MySQL devrait être utilisée. Voir aussi le guide MySQL : choisir une API ainsi que la FAQ associée pour plus d'informations. Les alternatives à cette fonction incluent :
$unescaped_string
[, resource $link_identifier
= NULL
] )
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 anti-slash 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
E_WARNING
est générée.
Retourne la chaîne échappée, ou FALSE
si une erreur survient.
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 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 magic_quotes_gpc est activée, appliquez d'abord la fonction stripslashes() à vos données. Utiliser cette fonction sur des données qui ont déjà été protégées, les protégera une deuxième fois.
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.