Heim  >  Artikel  >  WeChat-Applet  >  Detaillierte Erklärung, wie man SQL-Injection in PHP verhindert

Detaillierte Erklärung, wie man SQL-Injection in PHP verhindert

高洛峰
高洛峰Original
2017-02-21 15:08:401538Durchsuche

In diesem Artikel wird hauptsächlich beschrieben, wie man SQL-Injection in PHP verhindert. Es hat einen sehr guten Referenzwert, schauen wir es uns mit dem Editor unten an

1. Was ist ein SQL-Injection-Angriff?

Der sogenannte SQL-Injection-Angriff bedeutet, dass der Angreifer fügt einen SQL-Befehl ein. Geben Sie das Eingabefeld eines Webformulars oder die Abfragezeichenfolge einer Seitenanforderung ein, um den Server dazu zu verleiten, bösartige SQL-Befehle auszuführen. In einigen Formularen wird der vom Benutzer eingegebene Inhalt direkt zum Erstellen (oder Beeinflussen) dynamischer SQL-Befehle oder als Eingabeparameter für gespeicherte Prozeduren verwendet. Solche Formulare sind besonders anfällig für SQL-Injection-Angriffe. Übliche SQL-Injection-Angriffsprozesse sind wie folgt:

⑴ Eine ASP.NET-Webanwendung verfügt über eine Anmeldeseite. Diese Anmeldeseite steuert, ob der Benutzer die Berechtigung hat, auf die Anwendung zuzugreifen Passwort.

⑵ Der auf der Anmeldeseite eingegebene Inhalt wird direkt zum Erstellen dynamischer SQL-Befehle oder direkt als Parameter gespeicherter Prozeduren verwendet. Das Folgende ist ein Beispiel für eine ASP.NET-Anwendung, die eine Abfrage erstellt:

 System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")。Append(txtLogin.Text)。Append("' AND password='")。Append(txtPassword.Text)。Append("'");

⑶ Der Angreifer gibt „' oder „1“ in den Benutzernamen ein und Passwort-Eingabefelder '='1" und dergleichen.

⑷ Nachdem der vom Benutzer eingegebene Inhalt an den Server übermittelt wurde, führt der Server den oben genannten ASP.NET-Code aus, um einen SQL-Befehl zur Abfrage des Benutzers zu erstellen Speziell, der letzte SQL-Befehl lautet: SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'.

⑸ Der Server führt das aus Abfrage oder gespeicherte Prozedur und konvertiert die Benutzereingabe. Vergleichen Sie die Identitätsinformationen mit den auf dem Server gespeicherten Identitätsinformationen.

⑹ Da der SQL-Befehl tatsächlich durch einen Injektionsangriff geändert wurde, kann die Identität des Benutzers nicht wirklich überprüft werden, sodass das System den Angreifer fälschlicherweise autorisiert.

Wenn ein Angreifer weiß, dass die Anwendung den im Formular eingegebenen Inhalt direkt für Abfragen zur Identitätsprüfung verwenden wird, wird er versuchen, einige spezielle SQL-Zeichenfolgen einzugeben, um die Abfrage zu manipulieren, ihre ursprüngliche Funktionalität zu ändern und das System auszutricksen in die Gewährung von Zugriffsrechten.

Je nach Systemumgebung ist auch der Schaden, den ein Angreifer anrichten kann, unterschiedlich, was hauptsächlich durch die Sicherheitsberechtigungen der Anwendung für den Zugriff auf die Datenbank bestimmt wird. Wenn das Konto des Benutzers über Administrator- oder andere relativ erweiterte Rechte verfügt, kann der Angreifer verschiedene Vorgänge an den Datenbanktabellen ausführen, die er ausführen möchte, darunter das Hinzufügen, Löschen oder Aktualisieren von Daten oder sogar das direkte Löschen der Tabelle.

2. Wie kann man das verhindern?

Glücklicherweise ist es nicht besonders schwierig, das Eindringen von SQL-Injection-Angriffen in ASP.NET-Anwendungen zu verhindern Formular zum Erstellen von SQL Filtern Sie vor der Ausgabe des Befehls einfach den gesamten Eingabeinhalt. Das Filtern von Eingaben kann auf verschiedene Arten erfolgen.

(1) Zum dynamischen Erstellen von SQL-Abfragen können Sie die folgende Technologie verwenden:

Erstens: Ersetzen Sie einfache Anführungszeichen, dh ändern Sie alle einfachen Anführungszeichen in zwei einfache Anführungszeichen, um Angreifer zu verhindern von der Änderung der Bedeutung von SQL-Befehlen. Wenn wir uns das vorherige Beispiel noch einmal ansehen, wird offensichtlich „SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'“ erhalten das gleiche "SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'" unterschiedliche Ergebnisse.

Zweitens: Entfernen Sie alle Bindestriche in Benutzereingaben, um zu verhindern, dass Angreifer Abfragen wie „SELECT * from Users WHERE login = ‚mas‘ – AND password =“ erstellen Da die Abfrage auskommentiert wurde und nicht mehr gültig ist, muss der Angreifer nur einen legitimen Benutzeranmeldenamen und nicht das Kennwort des Benutzers kennen, um erfolgreich Zugriff zu erhalten.

Drittens: Beschränken Sie die Berechtigungen des Datenbankkontos, das zum Ausführen von Abfragen verwendet wird. Verwenden Sie verschiedene Benutzerkonten, um Abfrage-, Einfüge-, Aktualisierungs- und Löschvorgänge durchzuführen. Durch die Isolierung der Vorgänge, die von verschiedenen Konten ausgeführt werden können, wird verhindert, dass der Ort, an dem ursprünglich der SELECT-Befehl ausgeführt wurde, für die Ausführung des INSERT-, UPDATE- oder DELETE-Befehls verwendet wird.

(2) Verwenden Sie gespeicherte Prozeduren, um alle Abfragen auszuführen. Die Art und Weise, wie SQL-Parameter übergeben werden, verhindert, dass Angreifer für Angriffe einfache Anführungszeichen und Bindestriche verwenden. Darüber hinaus können Datenbankberechtigungen so eingeschränkt werden, dass nur die Ausführung bestimmter gespeicherter Prozeduren möglich ist. Alle Benutzereingaben müssen dem Sicherheitskontext der aufgerufenen gespeicherten Prozedur entsprechen, sodass Injektionsangriffe nur schwer möglich sind.

(3) Begrenzen Sie die Länge der Formular- oder Abfragezeichenfolgeneingabe. Wenn der Anmeldename des Benutzers nur maximal 10 Zeichen umfasst, dürfen nicht mehr als 10 Zeichen in das Formular eingegeben werden. Dies erhöht die Schwierigkeit für Angreifer erheblich, schädlichen Code in SQL-Befehle einzufügen.

(4) Überprüfen Sie die Rechtmäßigkeit der Benutzereingaben und stellen Sie sicher, dass der eingegebene Inhalt nur legale Daten enthält. Die Datenprüfung sollte sowohl auf der Client- als auch auf der Serverseite durchgeführt werden. Die serverseitige Validierung wird durchgeführt, um die fragile Sicherheit des clientseitigen Validierungsmechanismus auszugleichen.

Auf der Clientseite ist es für einen Angreifer durchaus möglich, an den Quellcode der Webseite zu gelangen, das Skript zur Überprüfung der Rechtmäßigkeit zu ändern (oder das Skript direkt zu löschen) und dann den illegalen Inhalt über das an den Server zu übermitteln modifizierte Form. Daher besteht die einzige Möglichkeit, sicherzustellen, dass der Verifizierungsvorgang tatsächlich durchgeführt wurde, darin, die Verifizierung auch auf der Serverseite durchzuführen. Sie können viele der integrierten Validierungsobjekte verwenden, z. B. RegularExpressionValidator, der automatisch clientseitige Skripts zur Validierung generieren kann, und natürlich können Sie auch serverseitige Methodenaufrufe einfügen. Wenn Sie kein vorgefertigtes Validierungsobjekt finden, können Sie über CustomValidator selbst eines erstellen.

(5) Benutzeranmeldename, Passwort und andere Daten verschlüsseln und speichern. Das Verschlüsseln der vom Benutzer eingegebenen Daten und der anschließende Vergleich mit den in der Datenbank gespeicherten Daten ist gleichbedeutend mit dem „Sterilisieren“ der vom Benutzer eingegebenen Daten. Die vom Benutzer eingegebenen Daten haben für die Datenbank keine besondere Bedeutung mehr Angreifer daran gehindert, SQL-Befehle einzuschleusen. Die System.Web.Security.FormsAuthentication-Klasse verfügt über eine HashPasswordForStoringInConfigFile, die sich sehr gut zum Bereinigen von Eingabedaten eignet.

(6) Überprüfen Sie die Anzahl der Datensätze, die von der Abfrage zurückgegeben werden, die Daten extrahiert. Wenn das Programm nur die Rückgabe eines Datensatzes erfordert, der tatsächlich zurückgegebene Datensatz jedoch mehr als eine Zeile umfasst, wird dies als Fehler behandelt.

(7) Verwenden Sie vorbereitete Anweisungen

Ausführlichere Erläuterungen zu PHP-Methoden zur Verhinderung von SQL-Injection und verwandte Artikel finden Sie auf der chinesischen PHP-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