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
Cette extension est obsolète depuis PHP 5.5.0, et sera supprimée dans le futur. À la place, les extensions MySQLi ou PDO_MySQL doivent être utilisées. Voir aussi le guide MySQL : choix de l'API ainsi que la FAQ associée pour plus d'information. Voici les alternatives à cette fonction :
Description
$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.
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
E_WARNING
est générée.
Valeurs de retour
Retourne la chaîne échappée, ou FALSE
si une erreur survient.
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 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, 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.
Voir aussi
- mysql_set_charset() - Définit le jeu de caractères du client MySQL
- mysql_client_encoding() - Retourne le nom du jeu de caractères utilisé par le client MySQL
- addslashes() - Ajoute des antislashs dans une chaîne
- stripslashes() - Supprime les antislashs d'une chaîne
- La directive magic_quotes_gpc
- La directive magic_quotes_runtime