English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL-Injektion (Injection)

In diesem Tutorial werden Sie lernen, wie man häufige Datenbanklücken repariert.

Was ist SQL-Injektion?

SQL-Injektion ist eine Attacke, bei der der Angreifer schädliches SQL-Code durch Daten, die er in die Anwendungsservereingabe (z.B. Webformulareingaben) einfügt oder ausführt, injizieren oder ausführen kann.

Es kann verwendet werden, um sensible Informationen wie die Telefonnummer des Benutzers, die E-Mail-Adresse, Kreditkarteninformationen usw. öffentlich zu machen. Der Angreifer kann es auch verwenden, um den Authentifizierungsprozess zu umgehen und den Zugriff auf die gesamte Datenbank zu erhalten. Lassen Sie uns sehen, wie es funktioniert.

Wie funktioniert SQL-Injektion?

Berücksichtigen Sie das folgende SQL-Skript, das ein einfaches Beispiel für die Benutzerauthentifizierung in einer Webanwendung mit Benutzername und Passwort ist.

SELECT * FROM users WHERE username='username_val' AND password='password_val';

hierusername_valundpassword_valder Benutzername und das Passwort, das der Benutzer eingibt. Wenn der Benutzer "john" als Benutzername und " 123” als Passwort usw. Der Resultat-Ausdruck wird sein:

SELECT * FROM users WHERE username='john' AND password='123;

Aber stellen Sie sich vor, wenn der Benutzer ein Angreifer ist, hat er keine gültige Benutzername und Passwort im Eingabefeld eingeben, sondern ähnliche Werte wie folgende: ' OR 'x'='x

In diesem Fall wird der obige SQL-Abfrage wie folgt konstruiert:

SELECT * FROM users WHERE username='' OR 'x'='x' AND password='' OR 'x'='x';

Dieser Ausdruck ist ein gültiges SQL-Skript, da WHERE 'x'='x' immer wahr ist, wird die Abfrage zurückgebenusersAlle Zeilen im Tisch. Sie können sehen, dass der Angreifer durch einen kleinen Trick leicht alle sensiblen Informationen der Datenbank zugreifen kann.

wennusersgroße Tabelle enthält mehrere Millionen Zeilen, kann diese einzelne Anweisung auch durch Überlastung der Systemressourcen einen Dienstleistungsausfall (DoS-Angriff) verursachen und Ihre Anwendung für legitime Benutzer unzugänglich machen.

Warnung:Wenn Ihr Skript eineDELETEoderUPDATEWenn Sie eine Abfrage ausführen, können die Konsequenzen der SQL-Injection-Lücke sogar schlimmer sein. Angreifer können Daten aus der Tabelle löschen oder alle Zeilen dauerhaft ändern.

Verhindern Sie SQL-Injection

Überprüfen Sie immer die Benutzerinput und machen Sie keine Annahmen. Bauen Sie niemals SQL-Anweisungen direkt aus Benutzereingaben. Wenn Sie PHP und MySQL verwenden, können Sie die Funktion mysqli_real_escape_string() verwenden, um gültige SQL-Zeichenketten zu erstellen, die in SQL-Anweisungen verwendet werden können.

Dies ist ein sehr einfaches Beispiel zur Benutzeridentifikation mit PHP und MySQL, das zeigt, wie man SQL-Injection verhindert, wenn man von den Benutzereingaben ausgeht.

<?php
// Starting session
session_start();
 
/* Versuchen Sie, eine Verbindung zum MySQL-Server herzustellen.
   Angenommen, Sie führen den MySQL-Server mit Standardeinstellungen aus (Benutzer 'root' hat kein Passwort) */
$link = mysqli_connect("localhost", "root", "", "demo");
 
// Überprüfen Sie die Verbindung
if($link === false){
    die("Fehler: Verbindung zur Datenbank kann nicht hergestellt werden.");
}
 
// Verwenden Sie Escape, um die Sicherheit der Benutzerinput zu gewährleisten
$username_val = mysqli_real_escape_string($link, $_POST['username']);
$password_val = mysqli_real_escape_string($link, $_POST['password']);
 
if(isset($username_val, $password_val)){
    // Versuchen Sie, die Abfrageausführung auszuwählen
    $sql = "SELECT * FROM users WHERE username='" . $username_val . "' AND password='" . $password_val . "";
    if($result = mysqli_query($link, $sql)){
        if(mysqli_num_rows($result) == 1{
            // Der Benutzer wurde erfolgreich verifiziert, bitte führen Sie hier die erforderlichen Aktionen durch
            $row = mysqli_fetch_array($result);
            /*Speichern Sie den Wert in den Sitzungsvariablen
               damit es später in derselben Sitzungsreferenz abgerufen werden kann */
            $_SESSION['user_id'] = $row['user_id'];
            $_SESSION['first_name'] = $row['first_name'];
            header('Location: welcome.html');
        }
            echo "Fehler! Ungültiger Benutzername oder Passwort.";
        }
    }
        echo "Fehler: Es ist etwas schiefgelaufen. Bitte versuchen Sie es noch einmal.";
    }
}
 
// Verbindung schließen
mysqli_close($link);
?>

Tipp:Testen Sie die Größe und den Typ oder den Inhalt der vom Anwendungsentwurf empfangenen Daten und setzen Sie angemessene Beschränkungen, um die Ausnutzung der Systemressourcen zu verhindern.