Se protéger des injections SQL en PHP

Si l'input d'utilisateur est inséré sans contrôle dans la requête SQL, alors l'application devient vulnérable aux attaques de type injection SQL, comme le montre l'exemple ci-dessous:

$variable = $_POST['input_utilisateur']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
Dans cet exemple, l'utilisateur peut entrer valeur'); DROP TABLE table;--') . La requête devient:

mysql_query("INSERT INTO `table` (`column`) VALUES ('valeur'); DROP TABLE table;--')

Le but du pirate est de modifier la requête SQL pour pouvoir lire des informations cachées ou exécuter n'importe quelle autre opération (lecture, modification, suppression). Dans cet exemple, la table est supprimée de la base de données.
Ce type de failles est la plus répandue et la plus dangereuse et si votre code n'est pas sécurisé, le risque serait énorme.

La solution au failles de type injection SQL est l'utilisation des requêtes préparées ou requêtes paramétrables. La préparation de l'exécution, la requête est envoyée au serveur de la base de données dont il effectue une vérification de la syntaxe. Avec cette méthode, il est impossible au pirate d'injecter un code SQL malveillant.

Pour cela, vous avez trois options:

1- En utilisant les PDO:

$statement = $pdo->prepare('SELECT * FROM administrateur WHERE nom = :nom');

$statement->execute(array('nom' => $nom));

foreach ($statement as $row) {
  // faire quelque chose
}
2- En utilisant MySQLi:

$statement = $dbConnection->prepare('SELECT * FROM administrateur WHERE nom = ?');
$statement->bind_param('s', $nom);

$statement->execute();

$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
   // faire quelque chose
}
3- En utilisant la méthode PHP mysql_real_escape_string
PHP a sa propre méthode pour corriger la cette faille, mais il faut noter que les deux méthodes précédentes sont plus efficaces. mysql_real_escape_string prend un string qui va être utilisé dans la requête MySQL et retourne la même chaîne de caractères échappée à toute injection SQL. Les quotes(') son replacés par \'. Cette fonction nécessite que vous soyez déjà connecté à la base de données pour l'utiliser.

$nom = "' OR 1'"; 

$nom = mysql_real_escape_string($nom);

$query = "SELECT * FROM administrateur WHERE nom = '$nom'";
echo "Injection évitée : <br />" . $query . "<br />";

$name_vul = "'; DELETE FROM administrateur WHERE 1 or nom = '"; 

$name_vul = mysql_real_escape_string($name_vul);

$query_vul = "SELECT * FROM administrateur WHERE nom = '$nom'";
echo "Injection évitée : <br />" . $query_vul;




Partager cet article

Voir aussi: