В настоящее время мы разрабатываем функцию, часть которой позволяет пользователю определять предложение where для простого оператора select, поэтому он может ограничить результат, который он хочет получить, через графический интерфейс пользователя.Java: Пользователь предоставляет предложение where: как предотвратить SQL-инъекцию?
Имя таблицы может отличаться, но это просто «выберите * из TABLE_NAME» (я знаю, это ужасная идея, но клиент - король). Поскольку это предлагает неограниченные возможности для SQL-инъекции, я искал жизнеспособные подходы, чтобы хотя бы предотвратить наиболее широко используемые методы SQL-инъекций, в последние дни, и я не мог найти много информации. Большинство советов основаны на предположении, что пользователь предоставляет только параметры для запроса, которые могут быть решены с помощью PreparedStatements. Но в моем случае они практически бесполезны.
В настоящее время я думаю о двух подходах, которые я, вероятно, объединит для достижения наилучшего эффекта, но я не знаю, если не существует лучших способов предотвратить инъекции и как их реализовать (возможно, там для этого есть инструменты или фреймворки с открытым исходным кодом). Я думаю, анализировать текст и
- определить, что пользовательский ввод не должен содержать, на основе широко используемых методов инъекций SQL.
- Определите, как должен выглядеть пользовательский ввод.
Для 1. Я думаю, что создать класс утилиты, который будет содержать методы проверки различных случаев инъекции SQL. Я мог бы использовать регулярные выражения для распознавания шаблонов.
Для 2. Я думаю использовать либо регулярные выражения, либо структуру XText, чтобы определить DSL, поэтому вход пользователя принимается только тогда, когда он соответствует определенным правилам. Я также могу извлечь имена столбцов, чтобы проверить, действительно ли они существуют в текущем TABLE_NAME. Но в этом случае это заставит нас допускать только определенные ограничения для запроса (т. Е. Rownum < = 100 не будет работать или понадобится специальная обработка).
Буду признателен, если вы порекомендуете мне какие-либо лучшие приемы, инструменты или подходы, поскольку, как я уже упоминал, на эту тему мало информации.
Спасибо заранее!
В основном ваша точка 2: используйте генератор парсера с уже существующей грамматикой sql (я бы использовал antlr), используйте это для проверки и генерации запроса –
Существуют существующие инструменты. Возможно, Querydsl будет делать то, что вы хотите? – chrylis