如何在Esper中清理MySQL查询参数

时间:2014-08-12 15:42:26

标签: esper

我使用的是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表示查询基本上没有传递给数据库软件。那我该怎么办?我提出了四个想法:

  1. 使用EPL替换参数:不起作用,因为SQL表达式中的Esper不支持它。
  2. 使用EPL变量:应该可以通过类似epService.getEPAdministrator().getConfiguration().addVariable("parameter", String.class, parameter);的内容定义变量,然后使用语法"SELECT `sth` FROM `mytable` WHERE `att` = ${parameter}"进行MySQL查询。 Esper应该用相应的值替换变量。为它定义一个全局变量并不好,尽管之后可以再次使用epService.getEPAdministrator().getConfiguration().removeVariable("parameter", true);删除它。但更重要的是:那也不会清理不受信任的参数,也不能将它传递给数据库,对吧?
  3. 清理Java端的参数: Java端的查询应该通过PreparedStatement完成。由于它是technically impossible to get a MySQL query string out of a PreparedStatement,因此不是一种选择。我认为还有另一种安全方法可以清理传递给Java端数据库的参数。
  4. 定义EPL方面的所有约束:可能只需执行SELECT * FROM `mytable`而不定义任何约束,以便从MySQL数据库中选择所有内容,然后通过EPL定义约束并使用EPPreparedStatement。这是正确的方法吗?我担心这不是真正的高效,因为从MySQL数据库中读取了许多不需要的条目。
  5. 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

它是否适用于语句对象模型API?该API使您可以完全控制EPL的所有部分。

相关问题