2016-11-25 2 views
0

В настоящее время мы разрабатываем функцию, часть которой позволяет пользователю определять предложение where для простого оператора select, поэтому он может ограничить результат, который он хочет получить, через графический интерфейс пользователя.Java: Пользователь предоставляет предложение where: как предотвратить SQL-инъекцию?

Имя таблицы может отличаться, но это просто «выберите * из TABLE_NAME» (я знаю, это ужасная идея, но клиент - король). Поскольку это предлагает неограниченные возможности для SQL-инъекции, я искал жизнеспособные подходы, чтобы хотя бы предотвратить наиболее широко используемые методы SQL-инъекций, в последние дни, и я не мог найти много информации. Большинство советов основаны на предположении, что пользователь предоставляет только параметры для запроса, которые могут быть решены с помощью PreparedStatements. Но в моем случае они практически бесполезны.

В настоящее время я думаю о двух подходах, которые я, вероятно, объединит для достижения наилучшего эффекта, но я не знаю, если не существует лучших способов предотвратить инъекции и как их реализовать (возможно, там для этого есть инструменты или фреймворки с открытым исходным кодом). Я думаю, анализировать текст и

  1. определить, что пользовательский ввод не должен содержать, на основе широко используемых методов инъекций SQL.
  2. Определите, как должен выглядеть пользовательский ввод.

Для 1. Я думаю, что создать класс утилиты, который будет содержать методы проверки различных случаев инъекции SQL. Я мог бы использовать регулярные выражения для распознавания шаблонов.

Для 2. Я думаю использовать либо регулярные выражения, либо структуру XText, чтобы определить DSL, поэтому вход пользователя принимается только тогда, когда он соответствует определенным правилам. Я также могу извлечь имена столбцов, чтобы проверить, действительно ли они существуют в текущем TABLE_NAME. Но в этом случае это заставит нас допускать только определенные ограничения для запроса (т. Е. Rownum < = 100 не будет работать или понадобится специальная обработка).

Буду признателен, если вы порекомендуете мне какие-либо лучшие приемы, инструменты или подходы, поскольку, как я уже упоминал, на эту тему мало информации.

Спасибо заранее!

+0

В основном ваша точка 2: используйте генератор парсера с уже существующей грамматикой sql (я бы использовал antlr), используйте это для проверки и генерации запроса –

+0

Существуют существующие инструменты. Возможно, Querydsl будет делать то, что вы хотите? – chrylis

ответ

3

Вы строите инъекции SQL App

Две вещи, которые вы можете сделать:

  1. Предельные типы запросов пользователя базы данных может сделать. Например, не предоставляйте привилегии обновления.

  2. Ограничьте свои предложения, чтобы соответствовать только некоторым простым критериям, например.предложения должны соответствовать t.col = value. Затем сравните все входные данные с вашими правилами, используя простой синтаксический анализатор

Существует несколько методов впрыска, и может быть трудно получить их все.

+0

Lol, вот что я думал, когда я услышал требования. Можете ли вы порекомендовать простой синтаксический анализатор для такого типа анализа текста? Спасибо за ваш ответ! –

+0

Извините, я не знаю, если один из них, но я думаю, вы можете написать один через час или около того с помощью регулярных выражений. Ищите предложения, такие как t.col = number или t.col = 'string', соединенные вместе с AND. Ограничьте строки на буквы, цифры, пробелы и несколько других. Также убедитесь, что запрос не выполняется пользователем, у которого есть права на удаление, удаление, вставку и т. Д. – OneSolitaryNoob

+1

Вы, ребята, очень помогли мне, спасибо! Я голосовал за ваши ответы, но они будут рассчитывать, когда я получу больше очков. Я также уже говорил с архитектором системы, и мы выбрали один из предложенных вами вариантов: –

0

Я бы рассмотрел графический пользовательский интерфейс построителя запросов вместо ванильного SQL, где текстовое поле условия.

  • Например, если вы делаете Java, он просто может не быть такой большой работы для создания графического представления (умные окна со свойствами и этажерки), которые затем преобразуются в critera objects for Hibernate Criteria queries.
  • Кто знает, ваш клиент может быть более благодарен за построитель графических запросов, чем простое текстовое поле, которое требует помощи + опыта в SQL-запросах.
+0

Это правильный способ реализовать это, я знаю. Я буду говорить с нашим системным архитектором на следующей неделе, если клиент примет некоторые изменения в дизайне или ограничение простых ограничений SQL. Хорошо, что конечный пользователь не увидит эту функцию, а только админы клиента. –