Próbuję umieścić w javie jakiś iniekcję anti sql i jest mi bardzo trudno pracować z funkcją string „replaceAll”. Ostatecznie potrzebuję funkcji, która skonwertuje wszystkie istniejące \
na \\
, dowolne "
na \"
, dowolne '
na \'
i dowolne \n
na \\n
tak, że gdy ciąg jest oceniany przez wstrzyknięcia SQL MySQL, zostaną zablokowane.
Podłączyłem jakiś kod, z którym pracowałem, i cała \\\\\\\\\\\
funkcja przyprawia mnie o szaleństwo. Byłbym bardzo wdzięczny, gdyby ktoś miał na to przykład.
CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?
ponieważ instrukcja główna jest instrukcją DDL , nawet jeśli część, którą próbujesz sparametryzować, jest w rzeczywistości DML .Odpowiedzi:
PreparedStatements to droga do zrobienia, ponieważ uniemożliwiają iniekcję SQL. Oto prosty przykład uwzględniający dane wejściowe użytkownika jako parametry:
Bez względu na to, jakie znaki są w nazwie i e-mailu, zostaną one umieszczone bezpośrednio w bazie danych. Nie wpłyną one w żaden sposób na instrukcję INSERT.
Istnieją różne metody ustawiania dla różnych typów danych - to, której z nich używasz, zależy od tego, jakie są pola bazy danych. Na przykład, jeśli masz w bazie danych kolumnę INTEGER, powinieneś użyć
setInt
metody. Dokumentacja PreparedStatement zawiera listę wszystkich dostępnych metod ustawiania i pobierania danych.źródło
Jedynym sposobem zapobiegania iniekcji SQL jest sparametryzowany SQL. Po prostu nie jest możliwe zbudowanie filtra, który byłby mądrzejszy niż ludzie, którzy zarabiają na życie hakowaniem SQL.
Dlatego użyj parametrów dla wszystkich klauzul input, updates i where. Dynamiczny SQL to po prostu otwarte drzwi dla hakerów, co obejmuje dynamiczny SQL w procedurach składowanych. Parametryzacja, parametryzacja, parametryzacja.
źródło
Jeśli naprawdę nie możesz użyć opcji obrony 1: gotowe instrukcje (zapytania parametryczne) lub opcji obrony 2: procedury składowane , nie twórz własnego narzędzia, użyj interfejsu API OWASP Enterprise Security . Z OWASP ESAPI hostowanego w Google Code:
Aby uzyskać więcej informacji, zobacz temat Zapobieganie iniekcjom SQL w języku Java i ściągawka dotycząca zapobiegania iniekcjom SQL .
Zwróć szczególną uwagę na opcję obrony 3: ucieczka od wszystkich danych wprowadzonych przez użytkownika, która wprowadza projekt OWASP ESAPI ).
źródło
(Jest to odpowiedź na komentarz OP w pierwotnym pytaniu; Całkowicie zgadzam się, że narzędzie PreparedStatement jest narzędziem do tego zadania, a nie wyrażeniami regularnymi).
Kiedy mówisz
\n
, czy masz na myśli sekwencję\
+n
czy rzeczywisty znak nowego wiersza? Jeśli to\
+n
, zadanie jest dość proste:Aby dopasować jeden lewy ukośnik w danych wejściowych, należy umieścić cztery z nich w ciągu wyrażenia regularnego. Aby wstawić jeden odwrotny ukośnik na wyjściu, należy umieścić cztery z nich w ciągu zastępczym. Zakłada się, że tworzysz wyrażenia regularne i zamienniki w postaci literałów Java String. Jeśli utworzysz je w jakikolwiek inny sposób (np. Czytając je z pliku), nie musisz robić tego podwójnego znaku ucieczki.
Jeśli masz znak wysuwu wiersza na wejściu i chcesz go zastąpić sekwencją ucieczki, możesz wykonać drugie przejście przez wejście za pomocą tego:
A może chcesz dwa odwrotne ukośniki (nie jestem tego pewien):
źródło
PreparedStatements to sposób postępowania w większości, ale nie we wszystkich przypadkach. Czasami znajdziesz się w sytuacji, w której zapytanie lub jego część musi zostać zbudowane i zapisane jako łańcuch do późniejszego wykorzystania. Zapoznaj się ze ściągawką dotyczącą zapobiegania iniekcjom SQL w witrynie OWASP, aby uzyskać więcej informacji i interfejsów API w różnych językach programowania.
źródło
Przygotowane instrukcje są najlepszym rozwiązaniem, ale jeśli naprawdę musisz to zrobić ręcznie, możesz również użyć
StringEscapeUtils
klasy z biblioteki Apache Commons-Lang. MaescapeSql(String)
metodę, której możesz użyć:import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);
źródło
Użycie wyrażenia regularnego w celu usunięcia tekstu, który mógłby spowodować wstrzyknięcie SQL, brzmi tak, jakby instrukcja SQL była wysyłana do bazy danych za pośrednictwem,
Statement
a niePreparedStatement
.Jednym z najłatwiejszych sposobów zapobiegania iniekcji SQL w pierwszej kolejności jest użycie a
PreparedStatement
, który akceptuje dane do zastąpienia w instrukcji SQL przy użyciu symboli zastępczych, która nie polega na konkatenacji ciągów w celu utworzenia instrukcji SQL do wysłania do bazy danych.Aby uzyskać więcej informacji, dobrym początkiem byłoby użycie gotowych instrukcji z samouczków języka Java .
źródło
Jeśli masz do czynienia ze starszym systemem lub masz zbyt wiele miejsc, aby przełączyć się na
PreparedStatement
s w zbyt krótkim czasie - tj. Jeśli napotkasz przeszkodę w zastosowaniu najlepszych praktyk sugerowanych przez inne odpowiedzi, możesz wypróbować AntiSQLFilterźródło
Potrzebujesz poniższego kodu. Na pierwszy rzut oka może to wyglądać jak każdy stary kod, który wymyśliłem. Jednak spojrzałem na kod źródłowy http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement. java . Następnie dokładnie przejrzałem kod setString (int parameterIndex, String x), aby znaleźć znaki, z których ucieka, i dostosowałem to do mojej własnej klasy, aby można go było użyć do celów, których potrzebujesz. W końcu, jeśli jest to lista postaci, które uciekają Oracle, to świadomość, że jest to naprawdę pocieszające pod względem bezpieczeństwa. Może Oracle potrzebuje zachęty, aby dodać metodę podobną do tej dla następnej większej wersji Java.
źródło
mysql-connector-java-xxx
, azcase '\u00a5'
orazcase '\u20a9'
sprawozdania wydają został usuniętyorg.ostermiller.utils.StringHelper.escapeSQL()
lubcom.aoindustries.sql.SQLUtility.escapeSQL()
.Po przeszukaniu wielu testowych rozwiązań zapobiegających wstrzykiwaniu sqlmap do sql, w przypadku starszego systemu, który nie może wszędzie zastosować przygotowanych instrukcji.
temat java-security-cross-site-scripting-xss-and-sql-injection BYŁO ROZWIĄZANIEM
wypróbowałem rozwiązanie @Richard, ale nie zadziałało w moim przypadku. użyłem filtra
źródło
java-security-cross-site-scripting-xss-and-sql-injection topic
? Próbuję znaleźć rozwiązanie dla starszej aplikacji.Od: [Źródło]
}
źródło
Jeśli używasz PL / SQL, możesz go również użyć
DBMS_ASSERT
, aby oczyścić dane wejściowe, dzięki czemu możesz z niego korzystać bez martwienia się o wstrzyknięcia SQL.zobacz tę odpowiedź na przykład: https://stackoverflow.com/a/21406499/1726419
źródło