Как я могу безопасно разрешать определяемые пользователем SQL-запросы?

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

String slqCmdTxt = "SELECT * FROM TheTable WHERE " + userExpression;

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

Как я могу разрешить гибкие запросы к базе данных, не открывая себя для SQL-инъекций?


Подробнее:

На самом деле есть две таблицы, главная и вторичная с атрибутами. Одна основная запись может иметь множество атрибутов. Мы хотим запросить значения в обеих таблицах. Результаты обрабатываются в отчет, который будет более читабельным, чем простое табличное представление. Данные записываются программой C #, но текущее направление — запросить таблицу из компонента, написанного на Java.

Поэтому мне нужен способ предоставить пользовательские данные, а затем безопасно построить запрос. Для ограниченного набора входных данных я написал код для построения строки запроса с заданными входными данными и значениями параметров. Затем я просматриваю и добавляю входные значения в качестве параметров. Это привело к сложной цепочке струн, которую будет трудно изменить/расширить.

Теперь, когда я работаю с Java, некоторые поиски выявили библиотеки построения операторов SQL, такие как jOOQ...

10
задан TomU 21 July 2012 в 05:54
поделиться