我们目前正在开发一个功能,其中的一部分功能是允许用户为简单的选择语句定义一个where子句,这样他就可以通过GUI限制他想要得到的结果。Java:用户提供where子句:如何防止SQL注入?
表名可能有所不同,但它不过是一个“select * from TABLE_NAME”(我知道这是一个糟糕的主意,但客户是国王)。 由于这为SQL注入提供了无限的可能性,我一直在寻找可行的方法,至少在最后几天阻止最广泛使用的SQL注入技术,并且我找不到很多信息。大多数提示都基于假设,即用户只提供查询参数,可以通过PreparedStatements来解决。但在我的情况下,他们几乎没用。
我目前正在考虑两种方法,我可能会结合起来获得最佳效果,但我不知道,如果没有更好的方法来防止注射以及如何实现它(也许存在存在开源工具或框架)。 我认为分析文本和
- 定义,什么样的用户输入不能包含的基础上,广泛使用的SQL注入技术。
- 定义用户输入应该是什么样子。
对于1.我认为创建一个实用工具类,其中将包含检查不同SQL注入案例的方法。我可以使用正则表达式来识别模式。
对于2.我认为要使用正则表达式或XText框架来定义一个DSL,所以用户输入只有在符合规定的规则时才被接受。我也可以提取列名来检查它们是否确实存在于当前的TABLE_NAME中。但在这种情况下,它会迫使我们只允许对查询进行某种限制(即rownum < = 100不起作用,或者需要特殊处理)。
如果你能向我推荐任何更好的技术,工具或方法,我将非常感激,因为正如我所提到的,在这个主题上没有太多的信息。
预先感谢您!
基本上你的观点2:使用一些解析器生成器与已有的sql语法(我会使用antlr),使用它来验证并生成查询 –
有现有的工具。也许Querydsl会做你想做的事情? – chrylis