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 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 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 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.
- 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 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 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 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 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.
Facebook
Twitter
Google+