Ich versuche, eine Anti-SQL-Injektion in Java zu installieren, und finde es sehr schwierig, mit der String-Funktion "replaceAll" zu arbeiten. Letztendlich brauche ich eine Funktion, die alle vorhandenen \
in \\
, alle "
in \"
, alle '
in \'
und alle \n
in konvertiert , \\n
damit bei der Auswertung der Zeichenfolge durch MySQL SQL-Injektionen blockiert werden.
Ich habe einen Code aufgebockt, mit dem ich gearbeitet habe, und alle \\\\\\\\\\\
Funktionen machen meine Augen verrückt. Wenn jemand ein Beispiel dafür hat, würde ich es sehr schätzen.
CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?
da die Hauptanweisung eine DDL- Anweisung ist, obwohl der Teil, den Sie parametrisieren möchten, tatsächlich DML ist .Antworten:
PreparedStatements sind der richtige Weg, da sie eine SQL-Injection unmöglich machen. Hier ist ein einfaches Beispiel, in dem die Benutzereingaben als Parameter verwendet werden:
Unabhängig davon, welche Zeichen in Name und E-Mail enthalten sind, werden diese Zeichen direkt in der Datenbank abgelegt. Sie haben keinerlei Auswirkungen auf die INSERT-Anweisung.
Es gibt verschiedene Set-Methoden für verschiedene Datentypen. Welche Sie verwenden, hängt von Ihren Datenbankfeldern ab. Wenn Sie beispielsweise eine INTEGER-Spalte in der Datenbank haben, sollten Sie eine
setInt
Methode verwenden. In der PreparedStatement-Dokumentation sind alle verschiedenen Methoden zum Festlegen und Abrufen von Daten aufgeführt.quelle
Die einzige Möglichkeit, die SQL-Injection zu verhindern, ist die Parametrisierung von SQL. Es ist einfach nicht möglich, einen Filter zu erstellen, der intelligenter ist als die Leute, die SQL für ihren Lebensunterhalt hacken.
Verwenden Sie daher Parameter für alle Eingaben, Aktualisierungen und where-Klauseln. Dynamisches SQL ist einfach eine offene Tür für Hacker, und dazu gehört auch dynamisches SQL in gespeicherten Prozeduren. Parametrieren, parametrisieren, parametrisieren.
quelle
Wenn Sie Defense Option 1: Vorbereitete Anweisungen (parametrisierte Abfragen) oder Defense Option 2: Gespeicherte Prozeduren wirklich nicht verwenden können , erstellen Sie kein eigenes Tool, sondern verwenden Sie die OWASP Enterprise Security API . Aus dem auf Google Code gehosteten OWASP ESAPI :
Weitere Informationen finden Sie unter Verhindern von SQL Injection in Java und SQL Injection Prevention Cheat Sheet .
Achten Sie besonders auf Verteidigungsoption 3: Entkommen aller vom Benutzer bereitgestellten Eingaben , mit denen das OWASP ESAPI- Projekt eingeführt wird.
quelle
(Dies ist eine Antwort auf den Kommentar des OP unter der ursprünglichen Frage. Ich stimme voll und ganz zu, dass PreparedStatement das Werkzeug für diesen Job ist und keine regulären Ausdrücke.)
Wenn Sie sagen
\n
, meinen Sie die Sequenz\
+n
oder ein tatsächliches Zeilenvorschubzeichen? Wenn es\
+ istn
, ist die Aufgabe ziemlich einfach:Um einem Backslash in der Eingabe zu entsprechen, fügen Sie vier davon in die Regex-Zeichenfolge ein. Um einen Backslash in die Ausgabe einzufügen, fügen Sie vier davon in die Ersatzzeichenfolge ein. Dies setzt voraus, dass Sie die regulären Ausdrücke und Ersetzungen in Form von Java-String-Literalen erstellen. Wenn Sie sie auf andere Weise erstellen (z. B. indem Sie sie aus einer Datei lesen), müssen Sie nicht all diese doppelten Escapezeichen ausführen.
Wenn die Eingabe ein Zeilenvorschubzeichen enthält und Sie es durch eine Escape-Sequenz ersetzen möchten, können Sie die Eingabe folgendermaßen durchlaufen:
Oder vielleicht möchten Sie zwei Backslashes (da bin ich mir nicht ganz sicher):
quelle
PreparedStatements sind in den meisten, aber nicht in allen Fällen der richtige Weg. Manchmal befinden Sie sich in einer Situation, in der eine Abfrage oder ein Teil davon erstellt und zur späteren Verwendung als Zeichenfolge gespeichert werden muss. Weitere Informationen und APIs in verschiedenen Programmiersprachen finden Sie im SQL Injection Prevention Cheat Sheet auf der OWASP-Site .
quelle
Vorbereitete Anweisungen sind die beste Lösung. Wenn Sie dies jedoch wirklich manuell ausführen müssen, können Sie auch die
StringEscapeUtils
Klasse aus der Apache Commons-Lang-Bibliothek verwenden. Es gibt eineescapeSql(String)
Methode, die Sie verwenden können:import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);
quelle
Die Verwendung eines regulären Ausdrucks zum Entfernen von Text, der eine SQL-Injection verursachen könnte, klingt so, als würde die SQL-Anweisung über a
Statement
und nicht über a an die Datenbank gesendetPreparedStatement
.Eine der einfachsten Möglichkeiten, eine SQL-Injection zu verhindern, ist die Verwendung von a
PreparedStatement
, das Daten akzeptiert, die mithilfe von Platzhaltern in eine SQL-Anweisung eingesetzt werden sollen. Dies beruht nicht auf Zeichenfolgenverkettungen, um eine SQL-Anweisung zum Senden an die Datenbank zu erstellen.Weitere Informationen finden Sie unter Verwenden vorbereiteter Anweisungen aus den Java-Lernprogrammen .
quelle
PreparedStatement
Wenn Sie es mit einem Legacy-System zu tun haben oder zu viele Orte haben, um in zu kurzer Zeit zu s zu wechseln - dh wenn die Verwendung der von anderen Antworten vorgeschlagenen Best Practice behindert wird , können Sie AntiSQLFilter ausprobierenquelle
Sie benötigen den folgenden Code. Auf den ersten Blick mag dies wie jeder alte Code aussehen, den ich erfunden habe. Ich habe mir jedoch den Quellcode für http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement angesehen. Java . Danach habe ich den Code von setString (int parameterIndex, String x) sorgfältig durchgesehen, um die Zeichen zu finden, denen es entgeht, und dies an meine eigene Klasse angepasst, damit es für die von Ihnen benötigten Zwecke verwendet werden kann. Wenn dies die Liste der Zeichen ist, denen Oracle entgeht, ist es in Bezug auf die Sicherheit wirklich beruhigend, dies zu wissen. Möglicherweise benötigt Oracle einen Anstoß, um eine ähnliche Methode für die nächste große Java-Version hinzuzufügen.
quelle
mysql-connector-java-xxx
diecase '\u00a5'
undcase '\u20a9'
Anweisungen entfernt worden zu seinorg.ostermiller.utils.StringHelper.escapeSQL()
oder verwendencom.aoindustries.sql.SQLUtility.escapeSQL()
.Nach dem Durchsuchen einer Testlösung, um zu verhindern, dass SQLMap SQL-Injection ausführt, im Falle eines Legacy-Systems, das vorbereitete Anweisungen nicht überall anwenden kann.
Java-Security-Cross-Site-Scripting-xss-und-SQL-Injection-Thema Lösung
Ich habe @Richards Lösung ausprobiert, aber in meinem Fall nicht funktioniert. Ich habe einen Filter verwendet
quelle
java-security-cross-site-scripting-xss-and-sql-injection topic
? Ich versuche eine Lösung für eine Legacy-Anwendung zu finden.Von: [Quelle]
}}
quelle
Wenn Sie PL / SQL verwenden, können Sie auch verwenden
DBMS_ASSERT
, um Ihre Eingabe zu bereinigen, sodass Sie es verwenden können, ohne sich um SQL-Injektionen sorgen zu müssen.Siehe diese Antwort zum Beispiel: https://stackoverflow.com/a/21406499/1726419
quelle