Maison >développement back-end >tutoriel php >Explication détaillée des vulnérabilités d'injection SQL et de la prévention
Le principe de l'injection SQL : ajoutez un morceau de code SQL à l'instruction SQL d'origine, construisez une instruction SQL spéciale et utilisez les propres autorisations du programme pour implémenter les opérations requises.
Supposons qu'il existe maintenant une table utilisateur :
uidusernamepwd
1adminadmin222
2custome123456
Effectuez maintenant une opération de connexion :
<?php $conn=mysqli_connect("localhost","root","root","test"); // 连接数据库test if (!$conn) { # code...判断链接是否成功 echo "连接失败!"; echo mysqli_connect_error(); exit(); } mysqli_query($conn,"set names utf8"); // 指定编码格式 $user = $_GET['user']; $pwd = $_GET['pwd']; $sql="select * from user where username = '{$user}' and pwd = '{$pwd}'"; // sql语句 $result=mysqli_query($conn,$sql); // 执行sql语句,将执行结果返回到结果集中 $row=mysqli_fetch_array($result); // 从结果集中取得一行作为数组 echo "<pre class="brush:php;toolbar:false">"; print_r($row); ?>
Le code ci-dessus effectue une simple opération de connexion. Exécutez ce programme dans le navigateur : localhost/test/login.php?user=admin&pwd=admin222, L'exécuté. L'instruction SQL est équivalente à : select * from user which username= 'admin' et pwd = 'admin222', et le résultat de l'exécution sera obtenu.
Si vous demandez : localhost/test/login.php?user=admin&pwd=admin, il n'y aura aucun résultat de requête car le mot de passe et le nom d'utilisateur ne correspondent pas. C'est-à-dire l'instruction SQL : select * from user où username= 'admin' et pwd = 'admin' ne peuvent pas trouver le résultat. Ensuite, s'il s'agit d'une instruction SQL : sélectionnez * de l'utilisateur où username= 'admin' et pwd = 'admin' ou 1 = 1 ;? Vous pouvez l'essayer vous-même, vous pouvez obtenir ceci comme suit :
uidusernamepwd
1adminadmin222
2custome123456
Si vous y accédez sur le client : localhost/test/ connexion Qu'en est-il de .php?user=admin&pwd=admin%20or%201=1 ?
Il a directement contourné la vérification et obtenu les informations de l'utilisateur administrateur dans la base de données. Il s'agit d'une simple injection SQL.
Prévention de l'injection SQL :
(1) S'il s'agit d'une variable entière, utilisez la fonction intval() ou (int) pour convertir tous les paramètres entrants en une valeur numérique.
(2) Pour les variables de caractères, utilisez addlashes() pour convertir tous les ' (guillemets simples), " (guillemets doubles), (antislashes) et (espaces) en caractères contenant des antislashs.
(3) Échappez ou filtrez certains caractères spéciaux, tels que %, etc.
(4) Faites une sauvegarde des données 🎜>
php sur la vulnérabilité d'injection d'objet de désérialisationLe partage de cinq célèbres outils d'analyse des vulnérabilités d'injection SQL
php empêche le code de vulnérabilité SQL Inject
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!