Empêcher les 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 dans l'exemple ci-dessous:$variable = $_POST['input_utilisateur'];Dans cet exemple, l'utilisateur peut entrer valeur'); DROP TABLE table;--') . La requête devient:
mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
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');2- En utilisant MySQLi:
$statement->execute(array('nom' => $nom));
foreach ($statement as $row) {
// faire quelque chose
}
$statement = $dbConnection->prepare('SELECT * FROM administrateur WHERE nom = ?');3- En utilisant la méthode PHP mysql_real_escape_string
$statement->bind_param('s', $nom);
$statement->execute();
$result = $statement->get_result();
while ($row = $result->fetch_assoc()) {
// faire quelque chose
}
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;
Références:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php