【发布时间】:2017-04-10 07:17:02
【问题描述】:
我们目前正在开发一项功能,其中一部分是允许用户为简单的选择语句定义 where 子句,这样他就可以通过 GUI 限制他想要获得的结果。
表名可能不同,但它只是“从 TABLE_NAME 中选择 *”(我知道,这是一个糟糕的主意,但客户才是王道)。 由于这为 SQL 注入提供了无限的可能性,因此最近几天我一直在寻找可行的方法,以至少防止最广泛使用的 SQL 注入技术,但我找不到很多信息。大多数提示都是基于这样的假设,即用户只提供查询的参数,可以通过 PreparedStatements 解决。但就我而言,它们几乎没用。
我目前正在考虑两种方法,我可能会将它们结合起来以获得最佳效果,但我不知道,如果没有更好的方法来防止注射以及如何实现它(也许存在开源工具或框架)。 我想分析一下文本和
- 根据广泛使用的 SQL 注入技术,定义用户输入不得包含的内容。
- 定义用户输入的外观。
对于 1. 我想创建一个实用程序类,其中将包含检查不同 SQL 注入案例的方法。我可以即使用正则表达式来识别模式。
对于 2. 我认为使用正则表达式或 XText 框架来定义 DSL,因此仅当用户输入与定义的规则匹配时才被接受。我还可以提取列名来检查它们是否确实存在于当前的 TABLE_NAME 中。但在这种情况下,它将迫使我们只允许对查询进行某些类型的限制(即 rownum
如果您能向我推荐任何更好的技术、工具或方法,我将不胜感激,因为正如我所提到的,关于这个主题的信息并不多。
提前谢谢你!
【问题讨论】:
-
基本上你的观点 2:使用一些解析器生成器和已经存在的 sql 语法(我会使用 antlr),用它来验证和生成查询
-
已有工具。也许 Querydsl 会做你想做的事?
标签: java dynamic where sql-injection clause