8722 sujets

Développement web côté serveur, CMS

Bonsoir,

avant d'injecter dans ma base de données, j'ai prévu:

foreach( $_POST as $nom => $value ) $$nom = addslashes( $value ) ;


C'est pas folichon, comme protection. Qu'en pensez-vous ? Que préconisez-vous ?
Bonsoir dagobert,

À ma connaissance, le plus simple et le plus efficace afin de se protéger contre les attaques de type injection SQL est d'utiliser les requêtes préparées : https://www.php.net/manual/fr/pdo.prepared-statements.php.

Cela permet à ta base de données d'indiquer que les paramètres que tu passes à ta requête sont bien des valeurs et ne doivent pas être interprétées comme du SQL.

<?php

// Exemple de mauvais code :
$req = mysql_query("SELECT * FROM users WHERE username = '" + $username + "';");

// Exemple de code plus sûr :
$db = new PDO(/* arguments de connexion */);
$req = $db->prepare("SELECT * FROM users WHERE username = ':username';");
$req->bindParam(":username", $username);
$res = $req->execute()

?>
Salut,

+1 pour les requêtes préparés.

Et addslashes n'est généralement pas suffisant Smiley ohwell
Cela peut vaguement protéger tes chaînes de caractères (et encore il me semble qu'il y a certaines attaques qui exploitent des codes en hexadecimal qui ne contiennent donc pas de quotes et passent au travers ta fonction) mais cela ne protège pas les numéros.

Mini exemple du principe qui pourrait se produire :

$toto= 1;
"select * from tatable where toto=".addslashes( $toto );
=> select * from tatable where toto= 1;

$toto = 1 OR 1=1;
"select * from tatable where toto=".addslashes( $toto );
=> select * from tatable where toto= 1 OR 1 = 1 ; //toujours vrai tu obtiens toute la table


La même avec un update et tu te retrouves à corrompre toute une table Smiley ohwell