Heim >Technologie-Peripheriegeräte >IT Industrie >So schützen Sie Ihre Website vor SQL -Injektionsangriffen
SQL Injection Attack: Schlüsselpunkte
SQL Injection Attack ist eine schwerwiegende Sicherheitsbedrohung der Website.
Um SQL -Injektionsangriffe zu verhindern, vertrauen Sie den Benutzereingaben nicht und überprüfen Sie immer, ob ein potenzielles Angriffsmuster vorliegt. Dies beinhaltet nicht nur Texteingaben, sondern auch versteckte Eingaben, Abfragestnparameter, Cookies und Datei -Uploads.
Benutzereingabe sollte auf der Serverseite überprüft werden, um sicherzustellen, dass der Typ korrekt ist und potenzielle böswillige Befehle beseitigt. Dies kann auf verschiedene Arten erreicht werden, z. B. das Hinzufügen von Fluchtzeichen für Eingaben, die SQL -Befehle ändern können, oder das Ersetzen von Benutzereingaben in SQL -Befehlen durch Befehlsparameter.
Es ist entscheidend, den Website -Code regelmäßig auf potenzielle Schwachstellen zu überprüfen, und es ist auch wichtig, auf SQL -Injektionsangriffe vorbereitet zu werden. Zu den Maßnahmen zur Begrenzung des potenziellen Schadens gehört die Vermeidung der Verwendung von Administratorrechten, das Verschlingen sensibler Daten und die Speicherung sensibler Daten, es sei denn, dies ist absolut erforderlich.
Weitere Schutzmaßnahmen umfassen: Verwenden einer separaten Verbindung zum Lese- und Schreiben von Datenbankvorgängen, Einschränkung des Benutzerkontoszugriffs auf eine bestimmte IP-Adresse, die Verwendung von Windows-Authentifizierungsmodell in MS SQL Server und Verwendung starker Algorithmen wie SHA-2-Passwort-Hash.
Dank an Chris Lienert und Guido Tonnaer für ihre Hilfe bei der Überprüfung dieses Artikels.
Unter allen Angriffen gegen Websites ist die SQL -Injektion die gefährlichste und häufigste und wurde verwendet, um Unternehmen und Organisationen im vergangenen Jahr tatsächliche Schäden zu verursachen. Das Programm wurde verwendet, um bekannte Organisationen und Unternehmen anzugreifen, darunter TalkTalk, VTech, das Wall Street Journal und die US-Regierung.
Kurz gesagt, SQL -Injektion (auch als SQLI bezeichnet) nutzt Schwachstellen in Website -Eingabekanälen aus, um die Datenbank des Webanwendungs -Backends anzugreifen, das die sensibelsten und wertvollsten Informationen speichert. Angreifer können dieses Schema verwenden, um Daten zu stehlen oder zu manipulieren, die Anwendungsfunktionalität zu behindern und den administrativen Zugriff auf den Datenbankserver im schlimmsten Fall zu erhalten.
Hier ist das, was Sie über die SQL -Injektion wissen müssen und wie Sie Ihre Website vor ihren Angriffen schützen können.
Wie funktioniert SQL Injection Attack
SQL -Injektionsangriff wird durchgeführt, indem böswillige SQL -Befehle über Webanforderungen an den Datenbankserver gesendet werden. Jeder Eingangskanal kann verwendet werden, um böswillige Befehle zu senden, einschließlich Formularelemente, Abfragebräge, Cookies und Dateien.
Um zu verstehen, wie es funktioniert
Wenn ein Benutzer seine Anmeldeinformationen eingibt und die Schaltfläche "Login" drückt, werden die Informationen auf Ihren Webserver veröffentlicht und mit SQL -Befehlen kombiniert. Zum Beispiel sieht der Code in PHP so aus:
<code class="language-php">$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'"; </code>
Der Befehl wird dann an den Datenbankserver gesendet, und der generierte Datensatz bestimmt, ob der Benutzername und das Kennwort einem gültigen Benutzerkonto entsprechen. Die durchschnittliche Benutzereingabe "John" als Benutzername und "123456" als Passwort (übrigens, verwenden Sie dieses Passwort nie) in den folgenden Befehl konvertiert:
<code class="language-sql">SELECT * FROM users WHERE username='john' AND password='123456' </code>
Aber wenn der Benutzer sich entscheidet, etwas anderes auszuprobieren, z. B. Folgendes:
<code class="language-sql">SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' </code>Dieser Code -Snippet kann es dem Benutzer ermöglichen, den Anmeldebildschirm zu umgehen, ohne die richtigen Anmeldeinformationen zu haben.
Dies ist eine der einfachsten Formen der SQL -Injektion. Mit nur etwas mehr Aufwand kann derselbe Benutzer ein neues Benutzerkonto einfügen und ein vorhandenes Benutzerkonto löschen oder ändern. Auf der Seite, auf der die Ergebnisse angezeigt werden, kann das gleiche Schema verwendet werden, um Datensätze und Informationen anzuzeigen, die ursprünglich auf die Anzeige von gewöhnlichen Besuchern beschränkt waren, oder um den Inhalt von Datensätzen zu ändern.
In ernsthafteren Fällen kann ein Angreifer das Betriebssystem des Servers sogar vollständig zerstören, wenn er über ein Administratorkonto mit dem Datenbankserver verbunden ist (z. B. "Root" in MySQL oder "SA" in MS SQL Server). Auf einem Windows -Server kann dies als Angreifer manifestieren, der eine erweiterte gespeicherte Prozedur wie XP_CMDSHELL durchführt. In einem Fall nutzte ein Angreifer die Anfälligkeit für die SQL -Injektion, um Benutzerkonten auf einem infizierten Server zu erstellen, Remote -Desktop -Funktionen zu aktivieren, Shared SMB -Ordner einzurichten und Malware hochzuladen.
wie Sie sich vor SQL -Injektionsangriffen schützen
Da der Benutzereingabekanal das primäre Medium der SQL -Injektionsangriffe ist, beinhalten die meisten Abwehrkräfte die Steuerung und Zensierung der Benutzereingaben für Angriffsmuster.Folgende Maßnahmen, die sicherstellen können, dass die Benutzereingabe sicher ist.
Vertrauen Sie nicht der Benutzereingabe
Nur weil die Benutzeroberfläche des Browsers nicht erlaubt, Eingaben zu bedienen, bedeutet dies nicht, dass sie nicht manipuliert werden kann. Mit einfachen Tools wie Burp Suite können Benutzer HTTP -Anforderungen erfassen und alles ändern, einschließlich versteckter Formularwerte, bevor sie an den Server senden. Wenn Sie der Meinung sind, dass Sie intelligent genug sind, um Daten über Base64 zu codieren, können böswillige Benutzer sie problemlos dekodieren, ändern und wiederholen.
Überprüfung ist der Prozess, um sicherzustellen, dass der Benutzer den richtigen Eingangstyp bereitstellt und potenziell böswillige Befehle beseitigt, die in die Eingabezeichenfolge eingebettet werden können. In PHP können Sie beispielsweise MySQL_REAL_ESCAPE_STRING () verwenden, um Zeichen zu entkommen, die die Art der SQL -Befehle ändern können.
Die modifizierte Version des oben genannten Anmeldecode ist wie folgt:
<code class="language-php">$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'"; </code>
Diese einfache Änderung schützt Ihren Code vor Angriffen, indem es Fluchtzeichen () vor einzelnen Zitaten hinzufügt, die absichtlich von böswilligen Benutzern hinzugefügt wurden.
Ein kleiner Hinweis zur Validierung: Wenn Sie eine Client -Überprüfungsfunktion hinzufügen, leistet dies einen guten Job. Verlassen Sie sich jedoch nicht als Verteidigung gegen SQL -Injektionsangriffe. Während die Clientfunktionen möglicherweise schwieriger das Senden von böswilligen Eingaben erschweren, ist es einfach, einige Browser -Optimierungen und -Tools wie die oben genannten zu umgehen. Sie müssen es also mit serverseitiger Überprüfung ergänzen.
Einige Programmierplattformen (z. B. ASP.NET) enthalten integrierte Funktionen, die die Benutzereingabe für böswillige Inhalte automatisch bewerten. Hacker können sie jedoch mit genügend Geschicklichkeit und Sorgfalt umgehen, sodass Sie weiterhin Benutzereingaben über Ihren eigenen Sicherheitsprüfer ausführen sollten. Sie werden niemals zu vorsichtig sein.
Eine bessere Alternative als Flucht besteht darin, Befehlsparameter zu verwenden. Befehlsparameter werden definiert, indem Platzhalternamen in SQL -Befehlen hinzugefügt werden, die später durch Benutzereingaben ersetzt werden. ASP.NET bietet zu diesem Zweck einen sehr intuitiven und benutzerfreundlichen APIs-Satz von APIs.
Das Folgende wird in C# geschrieben, wie Sie Befehlsparameter verwenden, um Ihre Website vor SQL -Injektionsangriffen zu schützen:
<code class="language-sql">SELECT * FROM users WHERE username='john' AND password='123456' </code>
Sie erstellen zuerst ein SQLCommand -Objekt und verwenden das Paradigma @Parameter_Name in die Befehlszeichenfolge, in die die Benutzereingabe eingefügt werden sollte.
Anschließend erstellen Sie eine Instanz des SQLParameter -Objekts, in dem die Benutzereingabe darin eingefügt werden, anstatt sie direkt mit der Befehlszeichenfolge zu verkettet.
Schließlich fügen Sie das SQLParameter -Objekt zur Parametersammlung des SQLCommand -Objekts hinzu, das die Parameter durch die bereitgestellte Eingabe ersetzt. Ado.net ist für den Rest der Arbeit verantwortlich.
In PHP ist das Äquivalent eine Vorverarbeitungsanweisung, die komplexer ist als sein ASP.NET -Gegenstück. Sie können es hier erkunden.
Dieser Trick funktioniert für Sprachen vom Typ schwacher Typ wie PHP, dh Sie definieren normalerweise keine Datentypen für Variablen, und die Sprache behandelt automatisch Conversions verschiedener Datentypen voneinander.
erklärende Konvertierung kann als Verknüpfung verwendet werden, um die Eingabe zu entkommen, wenn Nicht-String-Typen beteiligt sind. Wenn der Benutzer also einen INT für den Alterparameter eingeben soll, können Sie den folgenden Code in PHP verwenden, um sicherzustellen, dass die Eingabe sicher ist:
<code class="language-sql">SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' </code>
Beachten Sie, dass dieser Code -Snippet nur den Typ der Eingabe überprüft, nicht den Bereich. Sie müssen also einen anderen Code ausführen, um sicherzustellen, dass der Benutzer kein negatives Alter eingibt - oder in einem unrealistischen Alter wie 1300.
Zusätzlich besteht eine weitere Best Practice darin, einzelne Zitate in SQL-Befehlen mit Nicht-String-Eingaben zu vermeiden. Verwenden Sie also nicht den folgenden Code ...
<code class="language-php">$sql_command = "select * from users where username = '" . $_POST['username']; $sql_command .= "' AND password = '" . $_POST['password'] . "'"; </code>
… Es wird sicherer sein, den folgenden Code zu verwenden:
<code class="language-sql">SELECT * FROM users WHERE username='john' AND password='123456' </code>
Wie man SQL -Injektionsanfälligkeiten ausschließt
Als allgemeine Praxis sollten Sie den Code für jede Seite überprüfen, um festzustellen, wo Sie Seiteninhalte, Befehle, Zeichenfolgen usw. mit Quellen kombinieren, die möglicherweise vom Benutzer stammen. Die Überprüfung Ihres Quellcodes auf Schwachstellen und Sicherheitslücken sollte ein inhärenter Bestandteil des Softwareentwicklungsprozesses sein.
Sie können auch Scan -Tools wie SQLMAP verwenden, um die Seiten der Website zu kriechen und potenzielle SQL -Injektionsanfälligkeiten zu finden. Tatsächlich verwenden Hacker dieses Tool häufig, um SQL -Injektionsangriffsvektoren auf Zielwebsites zu finden und zu nutzen. Warum also nicht die Sicherheit verbessern?
Ihre letzte Verteidigungslinie
Egal wie Sie die Sicherheit Ihrer Website stärken, Sie müssen auf den Tag vorbereitet sein, an dem die SQL -Injektion stattfindet. Schließlich müssen die Verteidiger, wie in der Cybersecurity -Branche bekannt, jeden Kampf gewinnen, aber Hacker müssen nur einmal gewinnen.
Hier sind einige Tipps, die Ihnen helfen, den Schaden zu minimieren, wenn Sie Opfer einer SQL -Injektion werden.
Die Verbindung Ihrer Webanwendung mit einem "Root" oder "SA" -Konto mit einem Datenbankserver ist einer der schwerwiegendsten Fehler, die Sie machen können. Wie bereits erwähnt, kann ein kompromittiertes Administratorkonto Hackern Zugriff auf das gesamte System gewähren. Selbst Nicht-Adminampfer-Konten können Schäden verursachen, die auf alle Datenbanken im Server zugreifen können, insbesondere wenn der Datenbankserver zwischen verschiedenen Anwendungen und Datenbanken gemeinsam genutzt wird.
Daher ist es besser, ein Konto zu verwenden, das einfache Les- und Schreibberechtigungen in eine bestimmte Datenbank im Backend der Website hat. Wenn Ihre Website also über die SQL -Injektion gehackt wird, wird der Schadensumfang auf diese begrenzt sein einzelne Datenbank innerhalb von Reichweite.
Ein erweiterterer Ansatz besteht darin, separate Verbindungen für Codesegmente zu verwenden, die aus der Datenbank lesen oder in die Datenbank schreiben und die Berechtigungen und Rollen jedes Segments weiter reduzieren. Beispielsweise kann eine Listenseite (nicht die Datenbank geändert, jedoch die Suchparameter ausführlich ändern) mithilfe von schreibgeschützten Verbindungen zur Datenbank codiert werden, um den Fehlerwiderstand des Codes weiter zu verbessern.
In MySQL wird die Sicherheit verbessert, indem der Zugriff auf Benutzerkonten auf einen bestimmten IP -Adressbereich (anstelle des "%" -Modells) eingeschränkt wird, um den Zugriff auf beschädigte Konten von Remote -Standorten von Remote -Standorten zu verhindern.
In MS SQL Server empfehle ich dringend, dass Sie das Windows -Authentifizierungsmodell verwenden, wodurch der Zugriff der Hacker auf die Datenbank einschränkt und sicherstellt, dass sie keine anderen Kanäle verwenden können, um Ihre Datenbank einzugeben.
, es sei denn, Sie planen, einige erweiterte Funktionen von SQL Server zu verwenden, es ist besser, Windows-Dienste für ein eingeschränktes Konto zu verwenden, anstatt ein hochpreisiger "lokales System" -Konto. Wenn das „SA“ -Konto unterbrochen ist, minimiert dies den Schaden.
Verschlüsseln Sie sensible Daten in der Datenbank. Dies umfasst Passwörter, Sicherheitsfragen und Antworten, Finanzdaten, Gesundheitsinformationen und andere Informationen, die für böswillige Akteure nützlich sein können. Dies stellt sicher, dass die Hacker, wenn sie Ihre Daten in der Hand haben wird angegriffen, die Person verliert ihren Wert, bevor sie entschlüsselt werden.
Wenn Sie Ihr Passwort haben, verwenden Sie starke Algorithmen wie SHA-2, die bald zum Branchenstandard für den Kennwortschutz werden. MD5 und SHA-1 sind veraltet und können umgekehrt werden.
Für andere Formen der Verschlüsselung achten Sie bitte auf den Ort, an dem Sie Ihre Schlüssel speichern, und nehmen Sie keine einzige Wette an. Wenn sich die Schlüssel direkt neben den verschlüsselten Daten befinden und der Hacker auf sie leicht zugreift, sobald der Server kompromittiert ist, macht es keinen Sinn, die Verschlüsselung zu verwenden.
Wenn Sie Informationen in einer Datenbank speichern, überlegen Sie, wie viel Schaden sie verursachen, wenn die Informationen in die Hände einer schlechten Person fallen, und entscheiden Sie, ob Sie sie wirklich speichern müssen. Der Ashley Madison Hacker hat die dunklen Geheimnisse und die meisten privaten Informationen von etwa 37 Millionen Menschen ins Internet durchgesickert und einen schwerwiegenden Schaden verursacht, teilweise aufgrund des Versäumnisses des Anbieters, vertrauliche Informationen aus seiner Datenbank zu löschen.
speichern Sie sich also keine vertraulichen Informationen in der Datenbank, es sei denn, Sie müssen es wirklich haben. Löschen Sie die Nachricht auch dann, wenn sie nicht mehr nützlich ist.
Endgültige Gedanken
SQL Injection gibt es seit Jahrzehnten und kann in den kommenden Jahren weiterhin die Rangliste der Verwundbarkeit weiterhin übertreffen. Es dauert nur ein paar einfache - aber sorgfältig berechnete - Schritte, um Sie und Ihre Benutzer davor zu schützen, und es sollte eine Ihrer obersten Prioritäten sein, wenn Sie den Quellcode für Sicherheitsverletzungen überprüfen.
Der Schlüssel zur Vermeidung des Opfers der nächsten großen SQL -Injektionsdatenverletzung ist: Erstens kontrollieren und überprüfen Sie die Benutzereingabe;
FAQs zum Schutz Ihrer Website vor SQL -Injektionsangriffen
Der erste Schritt zum Schutz Ihrer Website vor SQL -Injektionsangriffen besteht darin, zu verstehen, was die SQL -Injektion ist. Die SQL -Injektion ist eine Code -Injektionstechnik, mit der Angreifer böswillige SQL -Anweisungen zur Ausführung in Eingangsfelder einfügen. Dies kann zu unbefugtem Zugriff auf sensible Daten, Datenverlust und sogar Datenbeschädigung führen. Sobald Sie dies verstanden haben, können Sie Maßnahmen wie Eingabevalidierung, parametrisierte Abfragen und gespeicherte Prozeduren zum Schutz Ihrer Website implementieren.
Eingabeüberprüfung ist eine Methode zur Definition der Syntax-, Inhalts- und logischen Werte der Benutzereingabe. Auf diese Weise können Sie Angreifer daran hindern, böswilligen SQL -Code in das Eingabebuch der Website einzuführen. Dies liegt daran, dass der Eingangsprüfungsprozess alle Eingaben ablehnt, die die definierten Kriterien nicht erfüllen.
ist eine Art von SQL -Abfrage, bei der ein Platzhalter verwendet wird, um den Wert darzustellen, und der Wert selbst wird zum Ausführungszeitpunkt bereitgestellt. Dies bedeutet, dass selbst wenn ein Angreifer versucht, einen böswilligen SQL -Code einzufügen, er eher als wörtliche Zeichenfolge als als Teil des SQL -Befehls behandelt wird. Dies verhindert effektiv SQL -Injektionsangriffe.
gespeicherte Verfahren sind SQL -Anweisungen, die in einer Datenbank gespeichert sind und von einer Anwendung aufgerufen werden können. Sie können dazu beitragen, SQL -Injektionsangriffe zu verhindern, da sie keinen direkten Zugriff auf die Datenbank ermöglichen. Stattdessen verwenden sie Parameter, die nicht als SQL -Befehle ausgeführt werden und so verhindern, dass ein injizierter SQL -Code ausgeführt wird.
Die korrekte Fehlerbehandlung kann dazu beitragen, SQL -Injektionsangriffe zu verhindern, indem keine Informationen über die Datenbankstruktur oder die SQL -Syntax angegeben werden. Dies liegt daran, dass bei einem Fehler die Fehlermeldung einem Angreifer Hinweise auf die Datenbankstruktur oder die SQL -Syntax liefern kann, die sie dann verwenden können, um ihren Angriff zu verbessern.
Das Prinzip der Mindestberechtigung bedeutet, dass nur Benutzerkonten oder -prozesse die Berechtigungen bereitgestellt werden, die zur Ausführung ihrer beabsichtigten Funktionen erforderlich sind. Wenn beispielsweise ein Benutzerkonto nur Daten aus der Datenbank lesen muss, muss es keinen Schreibzugriff gewähren. Dies kann dazu beitragen, SQL -Injektionsangriffe zu verhindern, indem sie die Angreifer einschränken, wenn sie versuchen, die Sicherheitsanfälligkeit auszunutzen.
reguläre Aktualisierungen sind wichtig, um SQL -Injektionsangriffe zu verhindern, da sie normalerweise Patches für bekannte Schwachstellen enthalten. Wenn Sie Ihre Software auf dem neuesten Stand halten, können Sie sicherstellen, dass Sie vor bekannten Schwachstellen geschützt sind, die durch SQL -Injektionsangriffe ausgenutzt werden können.
Webanwendungsfeuerwall (WAF) kann Ihre Website vor SQL -Injektionsangriffen schützen, indem der HTTP -Datenverkehr zwischen Webanwendungen und Internet gefiltert und überwacht wird. Es kann SQL -Injektionsangriffe identifizieren und blockieren, indem er böswilliger SQL -Code in HTTP -Anforderungen erfasst.
Intrusion Detection System (IDS) kann dazu beitragen, SQL -Injektionsangriffe durch Überwachung des Netzwerkverkehrs und der Erkennung verdächtiger Aktivitäten zu verhindern. Wenn IDs einen potenziellen SQL -Injektionsangriff erkennen, kann es die Administratoren darauf aufmerksam machen, sogar Schritte zu unternehmen, um den Angriff zu verhindern.
Verschlüsselung kann dazu beitragen, Ihre Website vor SQL -Injektionsangriffen zu schützen, indem es den Angreifern schwerer macht, sensible Daten zu lesen. Auch wenn es einem Angreifer es schafft, die SQL -Injektionsanfälligkeit auszunutzen, müssen er die Daten, um sie zu verwenden, zu entschlüsseln.
Das obige ist der detaillierte Inhalt vonSo schützen Sie Ihre Website vor SQL -Injektionsangriffen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!