oder Wie Benutzerdaten Schützen Von SQL Injection

xkcd

Fakten:

SQL-Injektion hat schon so ziemlich seitdem websites gespeichert haben, Daten in Datenbanken.

Das Open Web Application Security Project bewertete Injektionsangriffe als eine der 10 größten Bedrohungen für Webanwendungen im Jahr 2017.,

SQL Injection ist immer noch für viele große Datenlecks verantwortlich. Im Jahr 2016, die Illinois und Arizona State Board of Wahlen, die Registrierung der Wähler-Datenbanken wurden verletzt. Während in Arizona keine Informationen gestohlen wurden, hatten Angreifer in Illinois Zugriff auf Wählerdaten wie Name, Adresse, Geburtsdatum, Geschlecht und teilweise Sozialversicherungsnummern für etwa 80.000 Personen.⁴

Das ist Erschreckend, Was Ist Es?

SQL Injection ist eine Art von Angriff, der auf die Datenbank einer Anwendung abzielt, indem unbeabsichtigter Code in Benutzereingabefelder eingefügt wird., Durch die Nutzung der SQL-Syntax kann der Angreifer Eingabefelder verwenden, um Informationen aus diesen Datenbanken zu erfassen-einschließlich Passwörtern und Kreditkartennummern. Jemand könnte sogar die Kontrolle über Ihre Datenbank übernehmen oder alle darin enthaltenen Informationen löschen.

Wie Funktioniert Es?

SQL Injection verwendet Informationen, die in ein Feld eingefügt werden, um die entsprechende SQL-Anweisung so zu bearbeiten, dass eine unbeabsichtigte Aktion ausgeführt wird.,

Hier ist ein einfaches Beispiel:

SELECT * FROM customers WHERE name = " + user_name + ";

In diesem Beispiel wird die Variable user_name direkt aus der Benutzereingabe auf einer Website erstellt. Diese Zeichenfolge wird in die obige SQL-Anweisung eingefügt und alle Felder, die sich auf diesen Benutzernamen beziehen, werden zurückgegeben. Keine große Sache.

Aber was passiert, wenn jemand Steve“ ODER 1=1; — als ihren Benutzernamen eingibt? dann wäre die generierte SQL wie folgt:

SELECT * FROM customers WHERE name = "Steve" OR 1=1;--";

Da 1=1 immer wahr ist, würde dies alle Daten in der Tabelle zurückgeben. Nicht gut!,

Let’s take one more look at that comic.

xkcd

The son’s name is Robert’); DROP TABLE students; — What would that do exactly?,

Nun, wir können davon ausgehen, dass, wenn Little Bobby Tables zur Schülerdatenbank der Schule hinzugefügt würde, die SQL-Anweisung ungefähr so aussehen würde:

INSERT INTO students (name) VALUES ('<Student Name>');

… und wenn wir Bobby einfügen…

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE students;--');

Da Bobbys Name den Namen enthält ); Das VALUES Argument wird in der Mitte seines Namens geschlossen und der Text, der auf DROP TABLE students folgt, ist eine neue SQL-Anweisung, die die ganze Tabelle. Schließlich kommentiert das — am Ende das verbleibende SQL aus, ignoriert im Wesentlichen den Rest des ursprünglichen Codes und stellt sicher, dass kein Fehler auftritt.,

Also, was Sie sagen, meine Daten werden nie wieder sicher sein?

Nein! Es gibt tatsächlich viele Schritte, die Sie unternehmen können, um sich vor dieser Art von Angriff zu schützen. Schauen wir uns einige an:

  1. Bereinigen Sie Daten. Der erste Schritt besteht darin, zu steuern, was der Benutzer eingeben darf. Der beste Weg, dies zu tun, besteht darin, die für ein bestimmtes Feld zulässigen Eingabetypen zu begrenzen., Beispielsweise können Sie in einem Telefonnummernfeld nur numerische Eingaben zulassen oder in einem E-Mail-Feld nur Zeichen zulassen, die sich in einer gültigen E-Mail-Adresse befinden. Offensichtlich benötigen einige Felder Zeichen, die bei einem Angriff verwendet werden können, sodass diese Methode nicht unschlagbar ist.
  2. Konfigurieren Sie die Fehlerberichterstattung. In der Standardfehlerberichterstattung für Datenbankverwaltungssysteme sind häufig Entwickler-Debugging-Informationen enthalten. Dies kann dem Angreifer hilfreiche Informationen wie Tabellennamen oder Spaltennamen zurückgeben., Stellen Sie sicher, dass Sie diese Art von Informationen nicht an externe Benutzer anzeigen, da dies das Leben eines potenziellen Angreifers erleichtern könnte.
  3. Gebundene Parameter verwenden. Mit gebundenen Parametern können Sie Benutzerdaten in einer Variablen speichern und dann in eine SQL-Anweisung einfügen, die mit Platzhaltern erstellt wurde. Da die SQL-Anweisung und die Variable separat an den Server gesendet werden, können gebundene Parameter gut vor Injection schützen. Nimm den kleinen Bobby T!, Ein Beispiel für gebundene Parameter in einer Update-Methode in Ruby würde wie folgt aussehen:
def update sql = <<-SQL UPDATE students SET name = ?, grade = ? WHERE id = ? SQL DB.execute(sql, )end

Es ist verrückt zu glauben, dass etwas so Einfaches und gut Verstandenes immer noch für so viele Verstöße gegen Big Data verantwortlich ist., Selbst in hochkarätigen Fällen wie den oben erwähnten Hacks zur Wählerregistrierung und dem jüngsten Equifax-Verstoß (der nicht auf SQL-Injection zurückzuführen war, sondern auf eine ähnliche Sicherheitsanfälligkeit, die das Unternehmen nicht behoben hat), liegt die Ursache der Sicherheitsanfälligkeit in menschlichem Versagen und mangelnder Liebe zum Detail. Sich die Zeit zu nehmen, das Problem sorgfältig zu durchdenken, kann uns erheblich dabei helfen, Benutzerdaten vor häufigen Verstößen, insbesondere SQL-Injektionen, zu schützen.