Protège une commande SQL de la présence de caractères spéciaux

# 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 :

- mysqli_real_escape_string()
- PDO::quote()

### Description

function mysql_real_escape_string(string `$unescaped_string`, resource `$link_identifier` = NULL): string

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_real_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 les données d'injection de caractères pouvant dévoyer cette requête.

Attention

# Sécurité : le jeu de caractères par défaut

Le jeu de caractères 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 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émontre 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 les 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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open