Използвам 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 заявката. Esper трябва да замени променливата със съответната стойност. Не е хубаво да се дефинира глобална променлива за него, въпреки че човек може да го премахне отново сepService.getEPAdministrator().getConfiguration().removeVariable("parameter", true);
след това. Но много по-важно: Това също не дезинфекцира ненадеждния параметър и не прави безопасното му предаване към базата данни, нали? - Прочистване на параметрите от страна на Java: Заявките от страна на Java трябва да се извършват чрез
PreparedStatement
. Тъй като е технически невъзможно да се получи MySQL низ на заявка отPreparedStatement
, това не е опция. Не мисля, че има друг безопасен начин за дезинфекция на параметър, предаден на база данни от страна на Java. - Дефиниране на всички ограничения от страна на EPL: Човек може просто да направи
SELECT * FROM `mytable`
без да дефинира ограничения, за да избере всичко от базата данни на MySQL и след това да дефинира ограниченията чрез EPL и да използваEPPreparedStatement
за него. Това ли е правилният път? Опасявам се, че това не е наистина ефективно, защото много записи се четат от базата данни MySQL, които не са необходими.
Някакви идеи?