Ich muss meinem Java-Programm eine Anweisung hinzufügen, um eine Datenbanktabelle zu aktualisieren:
%Vor%Ich habe gehört, dass dies durch eine SQL-Injektion wie folgt ausgenutzt werden kann:
%Vor% Mein Programm hat eine Java-GUI und alle Namen, Adressen und E-Mail-Werte werden von Jtextfields
abgerufen. Ich möchte wissen, wie der folgende Code ( DROP TABLE customer;
) meiner Einfügeanweisung von einem Hacker hinzugefügt werden kann und wie ich das verhindern kann.
Sie müssen PreparedStatement verwenden. z.B.
%Vor%Dies verhindert Injektionsangriffe.
Die Art und Weise, wie der Hacker sie einfügt, ist, wenn die Zeichenfolge, die Sie einfügen, von einer Eingabe stammt - z. ein Eingabefeld auf einer Webseite oder ein Eingabefeld in einem Formular in einer Anwendung oder ähnlichem.
Ich möchte wissen, wie diese Art von Code ("DROP TABLE-Kunde;") kann von einem Hacker zu meiner insert-Anweisung hinzugefügt werden
Zum Beispiel:
%Vor%würde diesen Wert in einfügen :
bringen %Vor%Ich möchte speziell wissen, wie ich das verhindern kann
Verwenden Sie vorbereitete Anweisungen und SQL-Argumente (Beispiel "gestohlen" von Matt Fellows):
%Vor%Parsen Sie auch die Werte, die Sie für solche Variablen haben, und stellen Sie sicher, dass sie keine unzulässigen Zeichen enthalten (z. B. ";" in einem Namen).
Ein Angreifer muss nur etwas wie '[email protected]"); DROP TABLE customer;
in das Feld für email
eingeben und Sie sind fertig.
Sie können dies verhindern, indem Sie das richtige Escaping für JDBC-Anweisungen verwenden.
Deshalb sollten Sie in Ihren String-Anweisungen Fragezeichen verwenden:
%Vor%wird hier
zitiert Wie in erklärt, dass dieser Beitrag , hilft dir PreparedStatement
alleine nicht, wenn du noch Strings verkettet hast.
Zum Beispiel kann ein Angreifer immer noch Folgendes tun:
Und es ist nicht nur SQL, sondern JPQL und HQL können kompromittiert werden, wenn Sie keine Bindeparameter verwenden:
%Vor%Unter dem Strich sollten Sie beim Erstellen von SQL-Anweisungen niemals die String-Verkettung verwenden. Verwenden Sie eine dedizierte API für diesen Zweck:
Gehen Sie auf PreparedStatement Vorteile eines PreparedStatement:
Die Vorkompilierung und das DB-seitige Zwischenspeichern der SQL-Anweisung führt zu einer insgesamt schnelleren Ausführung und der Möglichkeit, dieselbe SQL-Anweisung in Batches wiederzuverwenden.
Automatische Verhinderung von SQL-Injection-Angriffen durch eingebautes Entweichen von Anführungszeichen und anderen Sonderzeichen. Beachten Sie, dass dazu die Methode PreparedStatement setXxx () erforderlich ist, um den Wert
festzulegenTags und Links sql java mysql sql-injection