Я использую Esper 5.0 и мне нужно выполнить запрос данных из реляционной базы данных. В моем случае это база данных MySQL, подключенная через JDBC. Теперь я хотел бы сформулировать EPL-запрос к данным из базы данных. Следовательно, мой запрос похож на этот:
String parameter = "any"; // untrusted (!) parameter from some user input
String mySqlQuery = "SELECT `sth` FROM `mytable` WHERE `att` = " + parameter;
String query = "select sth from sql:myDB ['" + mySqlQuery + "']"
Теперь, как я могу дезинфицировать ненадежный параметр, который затем отправляется в мою базу данных MySQL? документация Esper говорит, что запрос в основном передается в программное обеспечение базы данных без изменений. Так что я могу сделать? Я придумал четыре идеи:
- Использование параметров подстановки EPL: не работает, так как не поддерживается Esper в выражениях SQL.
- Использование переменных EPL: должна быть возможность определить переменную с помощью чего-то вроде
epService.getEPAdministrator().getConfiguration().addVariable("parameter", String.class, parameter);
, а затем использовать синтаксис"SELECT `sth` FROM `mytable` WHERE `att` = ${parameter}"
для запроса MySQL. Эспер должен заменить переменную соответствующим значением. Нехорошо определять для него глобальную переменную, хотя впоследствии ее можно было бы снова удалить с помощьюepService.getEPAdministrator().getConfiguration().removeVariable("parameter", true);
. Но гораздо важнее: это также не очищает ненадежный параметр и не делает его безопасным для передачи в базу данных, верно? - Очистка параметров на стороне Java. Запросы на стороне Java должны выполняться через
PreparedStatement
. Поскольку технически невозможно получить строку запроса MySQL изPreparedStatement
, это не вариант. Я не думаю, что есть другой безопасный способ очистить параметр, переданный в базу данных на стороне Java. - Определение всех ограничений на стороне EPL: можно было бы просто выполнить
SELECT * FROM `mytable`
без определения каких-либо ограничений, чтобы выбрать все из базы данных MySQL, а затем определить ограничения через EPL и использоватьEPPreparedStatement
для этого. Это правильный путь? Я боюсь, что это не очень эффективно, потому что из базы данных MySQL считывается много записей, которые не нужны.
Любые идеи?