Maison >développement back-end >tutoriel php >Explication détaillée des vulnérabilités d'injection SQL et de la prévention

Explication détaillée des vulnérabilités d'injection SQL et de la prévention

小云云
小云云original
2018-03-14 14:42:082181parcourir

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 :

  1. <?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[&#39;user&#39;];
        $pwd = $_GET[&#39;pwd&#39;];
        $sql="select * from
     user where username = &#39;{$user}&#39; and pwd = &#39;{$pwd}&#39;";  
        // 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érialisation

Le 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn