Aktueller Standort: Startseite> Neueste Artikel> Die Rolle und der Wert von stmt_init bei der Verhinderung der SQL -Injektion

Die Rolle und der Wert von stmt_init bei der Verhinderung der SQL -Injektion

M66 2025-06-02

MySQLI :: STMT_INIT ist eine Methode in der PHP MySQLI -Erweiterung, mit der eine vorbereitete Anweisung initialisiert wird. Vorbereitete Aussagen sind ein Mechanismus zur Ausführung von SQL -Abfragen, die SQL -Abfragen von Variablen trennen können, die von Benutzern eingegeben wurden, wodurch die SQL -Injektionsangriffe effektiv vermieden werden. Durch diese Methode kann der Entwickler zunächst ein leeres Anweisungsobjekt erstellen, Parameter binden und in nachfolgenden Operationen ausführen.

Prinzipien zur Verhinderung von SQL -Injektionsangriffen

Das Prinzip des SQL -Injektionsangriffs besteht darin, dass der Angreifer böswilligen SQL -Code in die vom Benutzer eingegebenen Felder (wie den Benutzernamen, das Passwort usw. des Anmeldeformulars) injiziert und ihn direkt in die SQL -Abfrage in die SQL -Abfrage einspeisen. Auf diese Weise kann der Angreifer die ursprüngliche SQL -Anweisung ändern, um böswillige Operationen auszuführen. Um dies zu vermeiden, liefert MySQLI vorbereitete Aussagen und Bindungsparameter.

Mit Hilfe von MySQLI :: STMT_INIT können Entwickler die SQL -Injektion in den folgenden Schritten vermeiden:

  1. Separate Abfragestruktur und Daten: MySQLI :: STMT_INIT wird verwendet, um eine SQL -Abfragevorlage zu initialisieren, wobei die Abfragestruktur festgelegt ist, und die tatsächlichen Eingabedaten werden durch Parameterbindung an die Datenbank übergeben. Dies bedeutet, dass alle vom Benutzer eingegebenen Daten nicht direkt mit der SQL -Anweisung gespleißt, sondern als Parameter an die Datenbank übergeben werden.

  2. Bindungsparameter: Durch die Methode Bind_param können Entwickler die Benutzereingabe an die Parameter der SQL -Abfrage binden. Diese Eingabedaten werden vom MySQL -Server verarbeitet und entkommen, um sicherzustellen, dass sie nicht als SQL -Code ausgeführt werden. Beispielsweise werden Zeichenfolgen automatisch angegeben und die Zahlen entsprechend verarbeitet. Auf diese Weise kann auch wenn der Benutzer einen böswilligen SQL -Code betritt, die Ausführung der Abfrage nicht beeinträchtigen.

  3. Abfrage ausführen: Die Abfrage wird erst ausgeführt, nachdem alle Parameter gebunden sind. Auf diese Weise wird die gesamte Abfrageanweisung nicht manipuliert, selbst wenn der Benutzer eine Zeichenfolge mit dem SQL -Injektionscode eingibt, um die Sicherheit der Daten zu gewährleisten.

Wie verbessern Sie die Abfragesicherheit durch MySQLI :: STMT_INIT ?

Mit MySQLI :: STMT_INIT- und Vorverarbeitungsaussagen können wir das Risiko von SQL -Injektionsangriffen grundlegend verringern. Hier sind die Schritte, um dies zu erreichen:

  1. Initialisierungsanweisung: Verwenden Sie MySQLI :: STMT_INIT, um ein Anweisungsobjekt für leere Vorverarbeitungen zu erstellen.

     $conn = new mysqli('localhost', 'username', 'password', 'database');
    $stmt = $conn->stmt_init();
    
  2. SQL -Abfrage vorbereiten: Verwenden Sie die vorbereitende Methode, um eine vorbereitete SQL -Anweisungsvorlage zu erstellen. Beachten Sie, dass der Benutzereingangsteil in der SQL -Abfrage stattdessen Platzhalter (zum Beispiel ? ) Verwendet.

     $sql = "SELECT * FROM users WHERE username = ? AND password = ?";
    if ($stmt->prepare($sql)) {
        // Weiterer Betrieb
    }
    
  3. Bindungsparameter: Verwenden Sie die Methode BIND_PARAM , um den Benutzereingabwert an den Platzhalter in der SQL -Abfragevorlage zu binden. Der zweite Parameter dieser Methode repräsentiert den Typ des Parameters, wie z, z. B. S eine Zeichenfolge, i repräsentiert eine Ganzzahl usw.

     $stmt->bind_param('ss', $username, $password);
    
  4. Abfrage ausführen: Schließlich die SQL -Abfrage mit Parametern, die über die Ausführungsmethode ausgeführt werden sollen.

     $stmt->execute();
    

Auf diese Weise werden Benutzereingaben in SQL -Abfragen immer eher als Daten als als SQL -Code behandelt, wodurch SQL -Injektionsangriffe vermieden werden.

Beispielcode: Anmeldeverifizierung

Hier ist ein praktisches Beispiel, das zeigt, wie die SQL -Injektion mit MySQLI :: STMT_INIT verhindern kann:

 <?php
$conn = new mysqli('localhost', 'username', 'password', 'database');

// Überprüfen Sie, ob die Verbindung erfolgreich ist
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Benutzereingaben abrufen
$username = $_POST['username'];
$password = $_POST['password'];

// Initialisieren Sie Vorverarbeitungsanweisungen
$stmt = $conn->stmt_init();

if ($stmt->prepare("SELECT * FROM users WHERE username = ? AND password = ?")) {
    // Binden Sie Parameter
    $stmt->bind_param('ss', $username, $password);

    // Eine Frage ausführen
    $stmt->execute();

    // Ergebnisse erhalten
    $result = $stmt->get_result();

    if ($result->num_rows > 0) {
        echo "Erfolgreich anmelden!";
    } else {
        echo "Ungültiger Benutzername oder Passwort。";
    }

    // Aussage
    $stmt->close();
}

// Schließen Sie die Verbindung
$conn->close();
?>

In diesem Beispiel, selbst wenn der Benutzereingang einen böswilligen Code (z. B. admin "oder '1' = '1 ) enthält, wirkt sich die Eingabe nicht auf die Struktur der SQL -Abfrage aus, da sie als Parameter verarbeitet wird.