Dieser wikiHow zeigt Ihnen, wie Sie SQL-Injection mit Prepared Statements in PHP verhindern können. SQL Injection ist eine der häufigsten Sicherheitslücken in heutigen Webanwendungen. Vorbereitete Anweisungen verwenden gebundene Parameter und kombinieren keine Variablen mit SQL-Strings, sodass ein Angreifer die SQL-Anweisung nicht ändern kann.
Vorbereitete Anweisungen kombinieren die Variable mit der kompilierten SQL-Anweisung, sodass SQL und Variablen getrennt gesendet werden. Die Variablen werden dann als reine Zeichenfolgen interpretiert und sind nicht Teil der SQL-Anweisung. Mit den Methoden in den folgenden Schritten müssen Sie keine anderen SQL-Injection-Filtertechniken wie mysql_real_escape_string () verwenden.[1]

Teil eins von zwei:
SQL Injection verstehen

  1. 1 SQL Injection ist eine Art von Sicherheitsanfälligkeit in Anwendungen, die eine SQL-Datenbank verwenden. Die Sicherheitsanfälligkeit tritt auf, wenn eine Benutzereingabe in einer SQL-Anweisung verwendet wird:
     $ name = $ _GET['Nutzername']; $ Abfrage = "SELECT Passwort von tbl_user WHERE Name = '$ name' "; 
  2. 2 Der Wert, den ein Benutzer in die URL-Variable eingibt Nutzername wird der Variablen zugewiesen $ name. Es wird dann direkt in die SQL-Anweisung eingefügt, sodass der Benutzer die SQL-Anweisung bearbeiten kann.
     $ name = "admin" ODER 1 = 1 - "; $ Abfrage = "SELECT Passwort von tbl_user WHERE Name = '$ name' "; 
  3. 3 Die SQL-Datenbank erhält dann die SQL-Anweisung wie folgt:
     WÄHLEN Passwort VON tbl_users WOHER Name = 'Administrator' ODER 1=1 -- ' 
    • Dies ist eine gültige SQL-Anweisung, aber anstelle eines Kennworts für den Benutzer gibt die Anweisung alle Kennwörter in der Tabelle zurück tbl_user. Dies ist nicht etwas, das Sie in Ihren Webanwendungen möchten.

Teil zwei von zwei:
Verwenden von mySQLi zum Erstellen vorbereiteter Anweisungen

  1. 1 Erstellen Sie die mySQLi SELECT-Abfrage.
    Verwenden Sie den nachstehenden Code, um Daten aus einer Tabelle mit mySQLi Prepared Statements auszuwählen.
     $ name = $ _GET['Nutzername']; ob ($ stmt = $ mysqli->bereiten("SELECT Passwort von tbl_users WHERE Name =?"))  // Binde eine Variable an den Parameter als String.  $ stmt->bind_param("s", $ name); // Führe die Anweisung aus. $ stmt->ausführen(); // Erhalte die Variablen aus der Abfrage. $ stmt->bind_result($ Pass); // Hol die Daten. $ stmt->holen(); // Zeigen Sie die Daten an. drucken("Passwort für Benutzer % s ist % s\ n", $ name, $ Pass); // Schließen Sie die vorbereitete Anweisung. $ stmt->schließen();  

    • Hinweis: Die Variable $ mysqli ist das mySQLi-Verbindungsobjekt.
  2. 2 Erstellen Sie die mySQLi-INSERT-Abfrage. Verwenden Sie den folgenden Code, um Daten mit mySQLi Prepared Statements in eine Tabelle einzufügen.
     $ name = $ _GET['Nutzername']; $ Passwort = $ _GET['Passwort']; ob ($ stmt = $ mysqli->bereiten("INSERT INTO tbl_users (Name, Passwort) VALUES (?,?)"))  // Binde die Variablen an den Parameter als Strings.  $ stmt->bind_param("ss", $ name, $ Passwort); // Führe die Anweisung aus. $ stmt->ausführen(); // Schließen Sie die vorbereitete Anweisung. $ stmt->schließen();  

    • Hinweis: Die Variable $ mysqli ist das mySQLi-Verbindungsobjekt.
  3. 3 Erstellen Sie die mySQLi UPDATE-Abfrage. Verwenden Sie den folgenden Code, um Daten in einer Tabelle mit mySQLi Prepared Statements zu aktualisieren.
     $ name = $ _GET['Nutzername']; $ Passwort = $ _GET['Passwort']; ob ($ stmt = $ mysqli->bereiten("UPDATE tbl_users SET Passwort =? WHERE Name =?"))  // Binde die Variablen an den Parameter als Strings.  $ stmt->bind_param("ss", $ Passwort, $ name); // Führe die Anweisung aus. $ stmt->ausführen(); // Schließen Sie die vorbereitete Anweisung. $ stmt->schließen();  

    • Hinweis: Die Variable $ mysqli ist das mySQLi-Verbindungsobjekt.
  4. 4 Erstellen Sie die MySQLi DELETE-Abfrage. Das folgende Skript beschreibt das Löschen von Daten aus einer Tabelle mit mySQLi Prepared Statements.
     $ name = $ _GET['Nutzername']; $ Passwort = $ _GET['Passwort']; ob ($ stmt = $ mysqli->bereiten("DELETE FROM tbl_users WHERE Name =?"))  // Binden Sie die Variable als String an den Parameter.  $ stmt->bind_param("s", $ name); // Führe die Anweisung aus. $ stmt->ausführen(); // Schließen Sie die vorbereitete Anweisung. $ stmt->schließen();  

    • Hinweis: Die Variable $ mysqli ist das mySQLi-Verbindungsobjekt.