【问题标题】:Java: User provides the where-clause: how to prevent SQL injection?Java:用户提供 where-clause:如何防止 SQL 注入?
【发布时间】:2017-04-10 07:17:02
【问题描述】:

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

表名可能不同,但它只是“从 TABLE_NAME 中选择 *”(我知道,这是一个糟糕的主意,但客户才是王道)。 由于这为 SQL 注入提供了无限的可能性,因此最近几天我一直在寻找可行的方法,以至少防止最广泛使用的 SQL 注入技术,但我找不到很多信息。大多数提示都是基于这样的假设,即用户只提供查询的参数,可以通过 PreparedStatements 解决。但就我而言,它们几乎没用。

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

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

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

对于 2. 我认为使用正则表达式或 XText 框架来定义 DSL,因此仅当用户输入与定义的规则匹配时才被接受。我还可以提取列名来检查它们是否确实存在于当前的 TABLE_NAME 中。但在这种情况下,它将迫使我们只允许对查询进行某些类型的限制(即 rownum

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

提前谢谢你!

【问题讨论】:

  • 基本上你的观点 2:使用一些解析器生成器和已经存在的 sql 语法(我会使用 antlr),用它来验证和生成查询
  • 已有工具。也许 Querydsl 会做你想做的事?

标签: java dynamic where sql-injection clause


【解决方案1】:

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

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

【讨论】:

  • 我知道,这是实现这一点的正确方法。我将在下周与我们的系统架构师交谈,如果客户会接受设计中的一些更改,或者对简单 SQL 限制的限制。一件好事是,最终用户不会看到该功能,只有客户的管理员才能看到。
【解决方案2】:

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

你可以做两件事:

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

  2. 限制 where 子句只匹配一些简单的条件,例如a 子句必须匹配 t.col=value。然后使用简单的解析器将所有输入与您的规则进行比较

有几种注射技术,可能很难全部掌握。

【讨论】:

  • 大声笑,当我听到要求时,我就是这么想的。你能为这种类型的文本分析推荐一个简单的解析器吗?谢谢你的回答!
  • 对不起,我不知道是否有一个临时的,但我认为你可以使用正则表达式在一个小时左右的时间内写一个。查找像 t.col=number 或 t.col='string' 这样的子句通过 AND 连接在一起。将字符串限制为字母、数字、空格和其他一些字符串。还要确保查询不是由具有删除、删除、插入等权限的用户执行
  • 你们帮了我很多,谢谢!我投票支持你的答案,但当我获得更多积分时,它们会很重要。我也已经和系统架构师谈过了,我们选择了你建议的选项之一:)
  • 很高兴帮助 igor - 希望它能让你的生活更轻松
猜你喜欢
  • 2015-09-07
  • 2011-06-21
  • 2011-10-02
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多