Verhindert SQL-Injection-Angriffe in einem Java-Programm

8

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.

    
Grant 01.03.2012, 12:56
quelle

7 Antworten

17

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.

    
Matt Fellows 01.03.2012, 12:59
quelle
12
  

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).

    
m0skit0 01.03.2012 13:01
quelle
7

Sie können DIESEN Artikel nachlesen. :)

Ich empfehle Parameterized Queries:

%Vor%     
aF. 01.03.2012 12:58
quelle
5

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.

    
user647772 01.03.2012 13:00
quelle
2

Deshalb sollten Sie in Ihren String-Anweisungen Fragezeichen verwenden:

%Vor%

wird hier

zitiert     
dimitrisli 01.03.2012 13:00
quelle
1

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:

  • rufen Sie eine Schlaffunktion auf, so dass alle Ihre Datenbankverbindungen belegt sind und Ihre Anwendung daher nicht verfügbar ist
  • Extrahieren von sensiblen Daten aus der DB
  • Umgehen der Benutzerauthentifizierung

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:

Vlad Mihalcea 08.11.2016 15:12
quelle
0

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

festzulegen     
Mukesh Kumar 18.11.2015 11:32
quelle

Tags und Links