Fonction mysql_real_escape_string() de PHP
Définition et utilisation
La fonction mysql_real_escape_string() échappe les caractères spéciaux utilisés dans les chaînes de caractères des requêtes SQL.
Les caractères suivants sont affectés :
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Si succès, cette fonction retourne la chaîne échappée. Si échec, retourne false.
Syntaxe
mysql_real_escape_string(string,connection)
Paramètres | Description |
---|---|
string | Obligatoire. Définir la chaîne à échapper. |
connection | Optionnel. Définir la connexion MySQL. Si non spécifié, utilise la connexion précédente. |
Description
Cette fonction permet de string des caractères spéciaux sont échappés, et en tenant compte du jeu de caractères courant de la connexion, ils peuvent être utilisés en toute sécurité pour mysql_query().
Avis et commentaires
Avis :Vous pouvez utiliser cette fonction pour prévenir les attaques de base de données.
Exemple
Exemple 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Code pour obtenir le nom d'utilisateur et le mot de passe // Échapper le nom d'utilisateur et le mot de passe pour les utiliser dans une requête SQL $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Plus de code mysql_close($con); ?>
Exemple 2
Attaque de base de données. Cet exemple montre ce qui se passe si nous ne n'appliquons pas la fonction mysql_real_escape_string() aux noms d'utilisateur et mots de passe :
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } $sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'" mysql_query($sql); // Ne pas vérifier le nom d'utilisateur et le mot de passe // Cela peut être n'importe quel contenu entré par l'utilisateur, par exemple : $_POST['user'] = 'john'; $_POST['pwd'] = '" OR ''='"; // Certaines lignes de code... mysql_close($con); ?>
Alors, la requête SQL deviendra ainsi :
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
Cela signifie que n'importe quel utilisateur peut se connecter sans avoir à entrer un mot de passe valide.
Exemple 3
Mauvaise pratique pour prévenir les attaques de bases de données :
<?php function check_input($value) { // Supprimer les barres obliques if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Si ce n'est pas un nombre, ajouter des guillemets if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Effectuer une SQL sécurisée $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = "SELECT * FROM users WHERE user=$user AND password=$pwd"; mysql_query($sql); mysql_close($con); ?>