我使用的是Esper 5.0,需要对关系数据库中的数据执行查询。在我的例子中,这是一个通过JDBC连接的MySQL数据库。现在我想对数据库中的数据进行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 documentation表示查询基本上没有传递给数据库软件。那我该怎么办?我提出了四个想法:
epService.getEPAdministrator().getConfiguration().addVariable("parameter", String.class, parameter);
的内容定义变量,然后使用语法"SELECT `sth` FROM `mytable` WHERE `att` = ${parameter}"
进行MySQL查询。 Esper应该用相应的值替换变量。为它定义一个全局变量并不好,尽管之后可以再次使用epService.getEPAdministrator().getConfiguration().removeVariable("parameter", true);
删除它。但更重要的是:那也不会清理不受信任的参数,也不能将它传递给数据库,对吧?PreparedStatement
完成。由于它是technically impossible to get a MySQL query string out of a PreparedStatement
,因此不是一种选择。我认为还有另一种安全方法可以清理传递给Java端数据库的参数。SELECT * FROM `mytable`
而不定义任何约束,以便从MySQL数据库中选择所有内容,然后通过EPL定义约束并使用EPPreparedStatement
。这是正确的方法吗?我担心这不是真正的高效,因为从MySQL数据库中读取了许多不需要的条目。有什么想法吗?
答案 0 :(得分:0)
它是否适用于语句对象模型API?该API使您可以完全控制EPL的所有部分。