Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung der Schwachstellen und deren Vorbeugung durch SQL-Injection

Ausführliche Erläuterung der Schwachstellen und deren Vorbeugung durch SQL-Injection

小云云
小云云Original
2018-03-14 14:42:082144Durchsuche

Das Prinzip der SQL-Injection: Hängen Sie einen Teil des SQL-Codes an die ursprüngliche SQL-Anweisung an, erstellen Sie eine spezielle SQL-Anweisung und verwenden Sie die eigenen Berechtigungen des Programms, um die erforderlichen Vorgänge zu implementieren.

Angenommen, es gibt jetzt eine Benutzertabelle:

uidusernamepwd

1adminadmin222

2custome123456

Führen Sie nun einen Anmeldevorgang durch:

  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);  
    ?>

Der obige Code führt einen einfachen Anmeldevorgang im Browser aus: localhost/test/login.php?user=admin&pwd=admin222, Der ausgeführte Die SQL-Anweisung entspricht: „select * from user“ mit Benutzername = „admin“ und pwd = „admin222“, und das Ausführungsergebnis wird abgerufen.

Wenn Sie Folgendes anfordern: localhost/test/login.php?user=admin&pwd=admin, werden keine Abfrageergebnisse angezeigt, da das Passwort und der Benutzername nicht übereinstimmen. Das heißt, die SQL-Anweisung: select * from user where username= 'admin' and pwd = 'admin' kann das Ergebnis nicht finden. Dann, wenn es sich um eine SQL-Anweisung handelt: auswählen * vom Benutzer, wobei Benutzername = 'admin' und pwd = 'admin' oder 1 = 1;? Du kannst es selbst ausprobieren, das bekommst du wie folgt:

uidusernamepwd

1adminadmin222

2custome123456

Bei Zugriff auf dem Client: localhost/test/ login Was ist mit .php?user=admin&pwd=admin%20or%201=1?

Es hat die Überprüfung direkt umgangen und die Administrator-Benutzerinformationen in der Datenbank abgerufen. Dies ist eine einfache SQL-Injection.

Verhinderung von SQL-Injection:

(1) Wenn es sich um eine Ganzzahlvariable handelt, verwenden Sie die Funktion intval() oder (int), um alle eingehenden Parameter in einen numerischen Wert umzuwandeln.

(2) Verwenden Sie für Zeichenvariablen addslashes(), um alle ' (einfache Anführungszeichen), " (doppelte Anführungszeichen), (Backslashes) und (Leerzeichen) in Zeichen umzuwandeln, die Backslashes enthalten.

(3) Escapezeichen oder Filter für einige Sonderzeichen, z. B. %, usw.

(4) Erstellen Sie eine Datensicherung 🎜>

php über die Sicherheitslücke bei der Deserialisierung von Objekten

Fünf bekannte Tools zum Scannen von SQL-Injection-Schwachstellen teilen

PHP verhindert SQL-Inject-Schwachstellencode

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Schwachstellen und deren Vorbeugung durch SQL-Injection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn