Как я могу очистить параметры запроса MySQL в Esper

Я использую 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 говорит, что запрос в основном передается в программное обеспечение базы данных без изменений. Так что я могу сделать? Я придумал четыре идеи:

  1. Использование параметров подстановки EPL: не работает, так как не поддерживается Esper в выражениях SQL.
  2. Использование переменных EPL: должна быть возможность определить переменную с помощью чего-то вроде epService.getEPAdministrator().getConfiguration().addVariable("parameter", String.class, parameter);, а затем использовать синтаксис "SELECT `sth` FROM `mytable` WHERE `att` = ${parameter}" для запроса MySQL. Эспер должен заменить переменную соответствующим значением. Нехорошо определять для него глобальную переменную, хотя впоследствии ее можно было бы снова удалить с помощью epService.getEPAdministrator().getConfiguration().removeVariable("parameter", true);. Но гораздо важнее: это также не очищает ненадежный параметр и не делает его безопасным для передачи в базу данных, верно?
  3. Очистка параметров на стороне Java. Запросы на стороне Java должны выполняться через PreparedStatement. Поскольку технически невозможно получить строку запроса MySQL из PreparedStatement, это не вариант. Я не думаю, что есть другой безопасный способ очистить параметр, переданный в базу данных на стороне Java.
  4. Определение всех ограничений на стороне EPL: можно было бы просто выполнить SELECT * FROM `mytable` без определения каких-либо ограничений, чтобы выбрать все из базы данных MySQL, а затем определить ограничения через EPL и использовать EPPreparedStatement для этого. Это правильный путь? Я боюсь, что это не очень эффективно, потому что из базы данных MySQL считывается много записей, которые не нужны.

Любые идеи?


person Simon    schedule 12.08.2014    source источник


Ответы (1)


Будет ли это работать с API объектной модели оператора? Этот API дает вам полный контроль над всеми частями EPL.

person user650839    schedule 13.08.2014
comment
Ну... не знаю :-) Я новичок в Эспере. Если бы вы добавили пример, показывающий, как использовать его с оператором MySQL и как с его помощью дезинфицировать параметры, я был бы очень благодарен. - person Simon; 13.08.2014
comment
Кстати, почему бы вам не создать учетную запись Stackoverflow? :) Спасибо за помощь с #esper. - person Simon; 13.08.2014