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);
?>