Heim  >  Artikel  >  Backend-Entwicklung  >  So verhindern Sie die SQL-Injection in PHP

So verhindern Sie die SQL-Injection in PHP

墨辰丷
墨辰丷Original
2018-05-25 11:00:436840Durchsuche

In diesem Artikel wird hauptsächlich vorgestellt, wie man SQL-Injection in PHP verhindert. Es hat einen sehr guten Referenzwert

1. Was ist ein SQL-Injection-Angriff?

Beim sogenannten SQL-Injection-Angriff fügt der Angreifer SQL-Befehle in eine ein Webformular Geben Sie eine Abfragezeichenfolge für eine Domänen- oder Seitenanforderung ein, um den Server zur Ausführung eines böswilligen SQL-Befehls zu verleiten. 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. Zu den gängigen SQL-Injection-Angriffsprozessen gehören:

⑴ Eine ASP.NET-Webanwendung verfügt über eine Anmeldeseite. Diese Anmeldeseite steuert, ob der Benutzer über die Berechtigung zum Zugriff auf die Anwendung verfügt Geben Sie einen Namen und ein Passwort ein. ⑵ 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 tritt ein Geben Sie den Benutzernamen ein und geben Sie in das Passwort-Eingabefeld etwas wie „' oder ‚1‘=‘1“ ein.

⑷ Nachdem der vom Benutzer eingegebene Inhalt an den Server übermittelt wurde, führt der Server den obigen ASP.NET-Code aus, um den SQL-Befehl zur Abfrage des Benutzers zu erstellen , aber weil der Angreifer eingegeben hat Der Inhalt ist sehr speziell, daher lautet der letzte SQL-Befehl: SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'.

⑸ Der Server führt eine Abfrage oder gespeicherte Prozedur aus, um die vom Benutzer eingegebenen Identitätsinformationen mit den auf dem Server gespeicherten Identitätsinformationen zu vergleichen.

⑹ Da der SQL-Befehl tatsächlich durch einen Injektionsangriff geändert wurde, kann die Benutzeridentität nicht wirklich authentifiziert werden, sodass das System den Angreifer falsch autorisiert.

Wenn ein Angreifer weiß, dass die Anwendung den im Formular eingegebenen Inhalt direkt für Authentifizierungsabfragen verwenden wird, wird er versuchen, einige spezielle SQL-Zeichenfolgen einzugeben, um die Abfrage zu manipulieren und ihr Original zu ändern Funktion, um das System dazu zu verleiten, Zugriff zu gewähren. 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 zu verhindern Sie verwenden Bevor Sie den SQL-Befehl aus dem Formulareingabeinhalt erstellen, filtern Sie einfach den gesamten Eingabeinhalt. Das Filtern von Eingaben kann auf verschiedene Arten erfolgen.

(1) Für die dynamische Konstruktion von SQL-Abfragen kann die folgende Technologie verwendet werden:

Erstens: Ersetzen Sie einfache Anführungszeichen, dh ändern Sie alle einfachen Anführungszeichen in zwei einfache Anführungszeichen, um zu verhindern, dass Angreifer die Bedeutung von SQL-Befehlen ändern. 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 Benutzereingabeinhalten, um zu verhindern, dass Angreifer Klassen wie „SELECT * from Users WHERE login = ‚mas‘ — — AND password erstellen =''" und andere Abfragen, da die zweite Hälfte dieser Art von Abfrage auskommentiert wurde und nicht mehr gültig ist. Der Angreifer muss lediglich einen legalen Benutzeranmeldenamen kennen und muss überhaupt nicht das Kennwort des Benutzers kennen. Erhalten Sie Zugang.

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 ursprünglich für die Ausführung des SELECT-Befehls verwendete Ort 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 Eingabeinhalt 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 Übermitteln Sie illegale Inhalte über das geänderte Formular an den Server. 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) Benutzer-Anmeldenamen, 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) Verwendung vorbereiteter Aussagen

Das Obige ist der gesamte Inhalt davon Artikel, ich hoffe, dass er für das Studium aller hilfreich sein wird.


Verwandte Empfehlungen:

Detaillierte Erläuterung des Codebeispiels für die PHP-Injection-Point-Konstruktion

PHP-Injection-Beispiele

Detailliertes Verständnis der PHP-Objektinjektion, PHP-Injection-Tool, PHP-Website-Injection, Scan-Tool, PHP-manuelle Injektion

Das obige ist der detaillierte Inhalt vonSo verhindern Sie die SQL-Injection in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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