Ausbilder: Wie
Sie bisher gesehen haben, sind SQL-Injektionen sehr gefährlich.
Außerdem sind sie sehr leicht zu finden und zu murmeln.
Sie finden sie überall auf einigen wirklich berühmten Websites.
Menschen versuchen, diese Sicherheitsanfälligkeiten mithilfe von Filtern zu verhindern.
Filter können den Anschein erwecken, als gäbe es
keine Exploits. Wenn Sie sich jedoch mit Codierungen,
verschiedenen Codierungstypen oder einem Proxy-Server anstrengen, können
Sie die meisten dieser Filter umgehen.
Einige Programmierer verwenden eine Blacklist.
Zum Beispiel verhindern sie die Verwendung von Union, sie
verhindern die Verwendung von Insert und dergleichen.
Auch hier ist es nicht 100% sicher.
Es kann umgangen werden.
Verwenden Sie eine Whitelist?
Genau die gleichen Probleme wie die schwarze Liste.
Der beste Weg, dies zu tun, besteht darin, Ihre
Webanwendung so zu programmieren, dass kein Code in sie eingefügt und dann ausgeführt
werden kann.
Der beste Weg, dies zu tun, ist die Verwendung einer parametrisierten Anweisung,
bei der die Daten und der Code getrennt sind.
Der beste Weg, um Ihnen zu zeigen, was
ich damit meine, ist ein Beispiel.
Ich behalte in diesem Beispiel den geringsten Programmieraufwand.
Ich möchte nicht, dass es ein Programmierbeispiel ist.
Es gibt tatsächlich Fehler in der Programmierung, aber ich
versuche Ihnen das Konzept näher zu
bringen, als es zu programmieren.
Der verwundbare Code, den wir uns angesehen haben, hat dies getan.
Früher wurde * aus Konten ausgewählt, bei denen der Benutzername dem entspricht,
was wir in textbox1 eingegeben haben.
Dann haben wir in textbox1 geschrieben.
Lass es uns
hier schreiben. Früher haben wir admin gesagt und
dann das Zitat geschlossen.
Dann können wir eine Gewerkschaftsauswahl treffen und etwas
anderes ausführen.
Sobald wir fertig sind, haben wir den Kommentar hinzugefügt,
der im Grunde alles ignoriert, was danach kommt.
Wenn Sie dies kopieren und
hier einfügen, werden Sie
sehen, was passiert.
Lassen Sie uns das jetzt einfach
loswerden, denn das macht die Farben einfach nicht schön.
(murmelt) Eigentlich werde ich das nur kommentieren.
Es wird eine Auswahl * von Konten
durchgeführt, bei denen Benutzername gleich admin
ist, Gewerkschaft auswählen und ausführen, was auch immer wir tun möchten.
Das ist sehr schlecht und es ist sehr schwer, sich davor zu schützen.
Wie gesagt, mit Filtern und
so weiter werden wir das Problem nur verbergen, aber nicht beheben.
Der beste Weg,
dies zu tun, ist die Verwendung der parametrisierten Anweisungen wie folgt.
Dies ist der sichere Weg, dies zu tun.
Zunächst bereiten Sie Ihre Erklärung vor.
Die meisten Sprachen wie PHP
und alle haben tatsächlich eine solche Funktion.
Sie können select * von Konten vorbereiten, bei
denen der Benutzername dem Fragezeichen entspricht.
Dann senden Sie die Werte.
PHP weiß es jetzt.
Die SQL-Anweisung lautet select * von Konten, bei
denen der Benutzername gleich etwas ist.
Dann wird der Wert von textbox1 übernommen.
Also, selbst wenn wir hereinkommen und
unsere sehr hinterhältige Aussage
hier verwenden und
dort einfügen, wird die Webanwendung wissen, dass der
Wert dafür admin union select ist.
Es wird tatsächlich versucht,
aus Konten auszuwählen, in denen der Benutzername steht,
und dann werden eigene Anführungszeichen hinzugefügt, und
es wird versucht, einen Benutzernamen mit dem folgenden Benutzernamen zu finden.
Diese ganze Sache wird so ausgeführt.
Es wird also * von
Konten ausgewählt, bei denen Benutzername gleich admin union select ist,
dieses Hashtag.
Was auch immer Sie in Ihr Textfeld eingeben, wird als Wert gesendet.
Die Webanwendung weiß, dass dies ein
Wert ist, kein Code, und führt ihn niemals aus.
Dies schützt Sie daher vor SQL-Injektionen.
Sie können die Filter als zweite Verteidigungslinie
verwenden, und ich rate Ihnen
auch, die geringstmöglichen Berechtigungen zu verwenden.
Verwenden Sie für jede Datenbank einen Benutzer
mit den geringsten Berechtigungen.
Erlauben Sie den Benutzern nicht, alles zu tun, was sie wollen.
Wenn es sich um eine einfache Website handelt, die nur eine Auswahl vornimmt,
darf der Benutzer nur eine Auswahl treffen.
Wenn es nur ausgewählt und eingefügt werden
muss, lassen Sie sie nur auswählen und einfügen.
Dies ist eine Regel, die Sie bei allem
einhalten sollten, auch bei Linux-Systemen.
Stellen Sie sicher, dass die Berechtigungen immer so gering wie möglich sind.
Jeder Benutzer hat keine zusätzlichen Berechtigungen, die er
nicht benötigt.