Java:用户提供where子句:如何防止SQL注入?

Java: User provides the where-clause: how to prevent SQL injection?

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

table 名称可能不同,但它只是一个 "select * from TABLE_NAME"(我知道,这是一个糟糕的主意,但客户就是上帝)。 由于这为 SQL 注入提供了无限的可能性,我一直在寻找可行的方法,至少可以防止最广泛使用的 SQL 注入技术,在过去的几天里我找不到很多信息。大多数技巧都是基于这样的假设,即用户只提供查询的参数,这可以通过 PreparedStatements 来解决。但就我而言,它们几乎没用。

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

  1. 根据广泛使用的 SQL 注入技术,定义用户输入不得包含的内容。
  2. 定义用户输入的外观。

对于 1. 我想创建一个实用程序 class,它将包含检查不同 SQL 注入案例的方法。我可以即使用正则表达式来识别模式。

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

如果您能向我推荐任何更好的技术、工具或方法,我将不胜感激,因为正如我所提到的,关于这个主题的信息不多。

提前致谢!

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

  • 例如,如果您这样做 Java,那么创建图形表示(具有属性和诸如此类的聪明的盒子)然后映射到 critera objects for Hibernate Criteria queries 中可能并不是一件大事。
  • 谁知道呢,与需要 SQL 查询方面的帮助和专业知识的纯文本字段相比,您的客户可能更喜欢图形查询生成器。

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

您可以做两件事:

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

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

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

注入技术有多种,可能很难全部掌握。