Comment protéger votre site web des attaques par injection SQL ?
L'attaque par injection SQL signifie que l'attaquant utilise le mécanisme de saisie des utilisateurs légitimes du site pour envoyer du code SQL à la base de données pour exécution. La règle d'or pour éviter les attaques par injection SQL est la suivante : données provenant de sources externes Échapper avant d'atteindre la base de données. Cette règle s'applique non seulement aux instructions INSERT et UPDATE, mais également aux requêtes SELECT~
L'utilisation d'instructions précompilées dans les requêtes de script peut presque éliminer tous les problèmes d'attaque par injection SQL, mais si vous choisissez d'utiliser la méthode query(), Il n'y aura pas de protection de ce type - les entrées utilisateur ajoutées à la requête doivent être échappées manuellement. Le code est le suivant :
<?php $dbms = "mysql"; // 数据库的类型 $dbName ="php_cn"; //使用的数据库名称 $user = "root"; //使用的数据库用户名 $pwd = "root"; //使用的数据库密码 $host = "localhost"; //使用的主机名称 $dsn = "$dbms:host=$host;dbname=$dbName"; $name ='mr'; $name ="'or Name LIKE'%"; $query="select * from user where username = '".$name."'";//sql语句 try { $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo $result = $pdo->query($query); //输出结果集中的数据 foreach ($result as $row){ //输出结果集中的数据 ?> <tr> <td bgcolor="#FFFFFF"><div align="center"><?php echo $row['username'];?></div></td> </tr> <?php } }catch (Exception $e){ echo "ERROR!!".$e->getMessage()."<br>"; } ?>
Dans cet exemple, on suppose que la variable $name dans l'instruction SQL provient du formulaire soumis par l'utilisateur. Habituellement, l'utilisateur soumettra quelque chose comme "mr", qui générera l'instruction SQL suivante :
select * from user where username = 'mr'
Cela ne posera aucun problème dans le script, cependant, un attaquant "intelligent" Il est possible de saisir "'OR Name LIKE'%", résultant en l'instruction SQL suivante :
select * from user where username = 'mr'
Cela ne posera aucun problème dans le script, cependant, un attaquant "intelligent" peut saisir "'OR Name LIKE' %", ce qui donne l'instruction SQL suivante :
select * from user where username ="OR Name LIKE'%'
Cette entrée ouvrira la table entière pour l'attaquant, et s'il s'agit de données très sensibles, elles seront complètement exposées. Alors, quelle méthode peut-on utiliser pour résoudre ce problème ?
Solution
Pour résoudre ce problème, vous pouvez utiliser la méthode quote dans PDO pour échapper aux données transmises à la chaîne SQL, juste le Le code SQL doit être modifié pour :
$sql="select * from user where username = '".$pdo->quote($name)."'";
N'oubliez pas que chaque élément de données utilisé dans la requête SQL doit être cité. Il n'y a pas de raccourci pour cela, sauf si vous envisagez d'utiliser préparer() et exécuter(. ) méthodes.
Remarque :
Si vous utilisez la méthode PDO->query(), vous devez toujours La méthode use quote() fait référence à la saisie de l'utilisateur, rappelez-vous qu'elle est "toujours requise".
Si vous choisissez d'utiliser les méthodes préparer() et exécuter(), vous n'avez pas besoin de référencer les valeurs qui doivent être liées au SQL précompilé (par exemple : à insérer dans la valeur de la base de données d'importation), le pilote fera tout pour l'utilisateur. Cependant, il peut parfois ne pas être possible de lier une variable à une instruction SQL précompilée. En créant une instruction SQL dynamique, vous devez citer toutes les valeurs qui ne peuvent pas être liées (telles que la clause GROUP BY ou ORDER BY ou le nom de la table).
Voilà donc toutes les solutions pour protéger les sites Web contre les attaques par injection SQL. Je pense que tout le monde peut facilement maîtriser les points de connaissances de cette section~
.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!