Я пытаюсь внедрить некоторые анти-SQL инъекции в Java, и мне очень трудно работать со строковой функцией replaceAll. В конечном счете мне нужна функция, которая преобразует любые существующие \
в \\
, любые "
в \"
, любые '
в \'
и любые \n
в \\n
так, чтобы при оценке строки с помощью SQL-инъекций MySQL блокировалась.
Я испортил некоторый код, с которым работал, и все \\\\\\\\\\\
в функции заставляют мои глаза сходить с ума. Если у кого-то есть пример этого, я был бы очень признателен.
CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?
так как основной оператор - это DDL- утверждение, хотя часть, которую вы пытаетесь параметризовать, на самом деле является DML .Ответы:
PreparedStatements - это путь, потому что они делают внедрение SQL невозможным. Вот простой пример, принимающий пользовательский ввод в качестве параметров:
Независимо от того, какие символы есть в имени и электронном письме, эти символы будут помещены непосредственно в базу данных. Они никак не повлияют на оператор INSERT.
Существуют разные методы набора для разных типов данных - какой вы используете, зависит от того, какие поля вашей базы данных. Например, если у вас есть столбец INTEGER в базе данных, вы должны использовать
setInt
метод. В документации PreparedStatement перечислены все различные методы, доступные для установки и получения данных.источник
Единственный способ предотвратить внедрение SQL - это параметризованный SQL. Просто невозможно создать фильтр, который умнее людей, которые взламывают SQL на жизнь.
Поэтому используйте параметры для всех входных данных, обновлений и предложений where. Динамический SQL является просто открытой дверью для хакеров, и это включает динамический SQL в хранимых процедурах. Параметризация, параметризация, параметризация.
источник
Если вы действительно не можете использовать опцию защиты 1: подготовленные операторы (параметризованные запросы) или вариант защиты 2: хранимые процедуры , не создавайте свой собственный инструмент, используйте OWASP Enterprise Security API . Из OWASP ESAPI, размещенного в Google Code:
Дополнительные сведения см. В разделах «Предотвращение внедрения SQL в Java» и « Шпаргалка по предотвращению внедрения SQL» .
Обратите особое внимание на вариант защиты 3: экранирование всех вводимых пользователем данных , представляющих проект OWASP ESAPI ).
источник
(Это ответ на комментарий ОП под первоначальным вопросом; я полностью согласен с тем, что PreparedStatement является инструментом для этой работы, а не регулярными выражениями.)
Когда вы говорите
\n
, вы имеете в виду последовательность\
+n
или фактический символ перевода строки? Если это\
+n
, задача довольно проста:Чтобы сопоставить одну обратную косую черту во вводе, вы помещаете четыре из них в строку регулярного выражения. Чтобы поместить один обратный слеш в вывод, вы помещаете четыре из них в строку замены. Это предполагает, что вы создаете регулярные выражения и замены в форме литералов Java String. Если вы создаете их любым другим способом (например, читая их из файла), вам не нужно делать все это двойным экранированием.
Если у вас есть символ перевода строки на входе, и вы хотите заменить его на escape-последовательность, вы можете сделать второй проход по вводу с помощью этого:
Или, может быть, вы хотите две обратные косые черты (я не слишком ясно):
источник
PreparedStatements - это путь в большинстве, но не во всех случаях. Иногда вы окажетесь в ситуации, когда запрос или его часть должны быть построены и сохранены в виде строки для последующего использования. Ознакомьтесь с инструкциями по предотвращению инъекций SQL на сайте OWASP для получения более подробной информации и API на разных языках программирования.
источник
Подготовленные операторы являются лучшим решением, но если вам действительно нужно сделать это вручную, вы также можете использовать
StringEscapeUtils
класс из библиотеки Apache Commons-Lang. У него естьescapeSql(String)
метод, который вы можете использовать:import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);
источник
Использование регулярного выражения для удаления текста, который может вызвать внедрение SQL, звучит так, как будто оператор SQL отправляется в базу данных через,
Statement
а не черезPreparedStatement
.Одним из самых простых способов предотвратить внедрение SQL в первую очередь является использование a
PreparedStatement
, который принимает данные для замены в оператор SQL с использованием заполнителей, который не использует конкатенации строк для создания оператора SQL для отправки в базу данных.Для получения дополнительной информации было бы неплохо начать с использования подготовленных операторов из учебников по Java .
источник
Если вы имеете дело с унаследованной системой или у вас слишком много мест, чтобы переключиться на
PreparedStatement
s за слишком короткое время - то есть, если есть препятствие для использования передовой практики, предложенной другими ответами, вы можете попробовать AntiSQLFilterисточник
Вам нужен следующий код ниже. На первый взгляд, это может выглядеть как любой старый код, который я составил. Однако я посмотрел на исходный код http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement. Java . Затем, после этого, я внимательно просмотрел код setString (int parameterIndex, String x), чтобы найти символы, которые он экранировал, и настроил его для своего собственного класса, чтобы его можно было использовать в нужных вам целях. В конце концов, если это список символов, которые Oracle избегает, то знание этого действительно удобно с точки зрения безопасности. Может быть, Oracle нужен толчок, чтобы добавить метод, похожий на этот, для следующего основного выпуска Java.
источник
mysql-connector-java-xxx
, тоcase '\u00a5'
иcase '\u20a9'
заявлении , кажется , вывезенныйorg.ostermiller.utils.StringHelper.escapeSQL()
илиcom.aoindustries.sql.SQLUtility.escapeSQL()
.После поиска тестируемого решения для предотвращения sqlmap от внедрения sql, в случае устаревшей системы, которая не может применять подготовленные отчеты везде.
Java-безопасность межсайтовых-сценарии-XSS-и-SQL-инъекция тема была решением
Я попробовал решение @Richard s, но в моем случае это не сработало. я использовал фильтр
источник
java-security-cross-site-scripting-xss-and-sql-injection topic
? Я пытаюсь найти решение для устаревшего приложения.От: [Источник]
}
источник
Если вы используете PL / SQL, вы также можете использовать
DBMS_ASSERT
его для очистки вашего ввода, чтобы вы могли использовать его, не беспокоясь о SQL-инъекциях.см. этот ответ, например: https://stackoverflow.com/a/21406499/1726419
источник