Java:User提供了where子句:如何防止SQL注入?

时间:2016-11-25 21:42:55

标签: java dynamic where sql-injection clause

我们目前正在开发一个功能,其中一部分是允许用户为简单的select语句定义where子句,因此他可以通过GUI限制他想要获得的结果。

表格名称可能有所不同,但它只是一个" select * from TABLE_NAME" (我知道,这是一个糟糕的主意,但顾客才是王者)。 由于这为SQL注入提供了无限的可能性,我一直在寻找可行的方法,至少在最后几天阻止了最广泛使用的SQL注入技术,我找不到很多信息。大多数提示都基于这样的假设:用户只提供查询的参数,可以通过PreparedStatements解决。但就我而言,它们几乎毫无用处。

我目前正在考虑两种方法,我可能会将这些方法结合起来以获得最佳效果,但我不知道,如果没有更好的方法可以防止注射以及如何实现它(也许存在开源工具或框架)。 我想分析文本和

  1. 根据广泛使用的SQL注入技术定义用户输入不得包含的内容。
  2. 定义用户输入应该是什么样的。
  3. For 1.我想创建一个实用程序类,它将包含检查不同SQL注入案例的方法。我可以使用正则表达式识别模式。

    对于2.我认为使用正则表达式或XText框架来定义DSL,因此只有当用户输入与定义的规则匹配时才接受用户输入。我还可以提取要检查的列名称,如果它们实际存在于当前的TABLE_NAME中。但在这种情况下,它会迫使我们只允许对查询进行某种限制(即rownum< = 100不起作用,或者需要特殊处理)。

    如果你能推荐我任何更好的技巧,工具或方法,我将非常感激,因为正如我所提到的,关于这个主题的信息并不多。

    提前谢谢!

2 个答案:

答案 0 :(得分:3)

您正在构建一个sql注入应用程序

你可以做两件事:

  1. 限制数据库用户可以执行的查询类型。例如,不授予更新权限。

  2. 将您的where子句限制为仅匹配一些简单的条件,例如一个子句必须匹配t.col = value。然后使用简单的解析器

  3. 将所有输入与您的规则进行比较

    有几种注射技术,可能很难全部完成。

答案 1 :(得分:0)

我会考虑使用图形查询构建器UI而不是vanilla SQL where子句文本字段。

  • 例如,如果您使用Java,那么创建图形表示(具有属性和诸如此类的聪明框)然后映射到critera objects for Hibernate Criteria queries 可能不是一件大事。
  • 谁知道,您的客户可能更感谢图形查询构建器,而不是需要SQL查询帮助+专业知识的纯文本字段。