我们目前正在开发一个功能,其中一部分是允许用户为简单的select语句定义where子句,因此他可以通过GUI限制他想要获得的结果。
表格名称可能有所不同,但它只是一个" select * from TABLE_NAME" (我知道,这是一个糟糕的主意,但顾客才是王者)。 由于这为SQL注入提供了无限的可能性,我一直在寻找可行的方法,至少在最后几天阻止了最广泛使用的SQL注入技术,我找不到很多信息。大多数提示都基于这样的假设:用户只提供查询的参数,可以通过PreparedStatements解决。但就我而言,它们几乎毫无用处。
我目前正在考虑两种方法,我可能会将这些方法结合起来以获得最佳效果,但我不知道,如果没有更好的方法可以防止注射以及如何实现它(也许存在开源工具或框架)。 我想分析文本和
For 1.我想创建一个实用程序类,它将包含检查不同SQL注入案例的方法。我可以使用正则表达式识别模式。
对于2.我认为使用正则表达式或XText框架来定义DSL,因此只有当用户输入与定义的规则匹配时才接受用户输入。我还可以提取要检查的列名称,如果它们实际存在于当前的TABLE_NAME中。但在这种情况下,它会迫使我们只允许对查询进行某种限制(即rownum< = 100不起作用,或者需要特殊处理)。
如果你能推荐我任何更好的技巧,工具或方法,我将非常感激,因为正如我所提到的,关于这个主题的信息并不多。
提前谢谢!
答案 0 :(得分:3)
您正在构建一个sql注入应用程序
你可以做两件事:
限制数据库用户可以执行的查询类型。例如,不授予更新权限。
将您的where子句限制为仅匹配一些简单的条件,例如一个子句必须匹配t.col = value。然后使用简单的解析器
有几种注射技术,可能很难全部完成。
答案 1 :(得分:0)
我会考虑使用图形查询构建器UI而不是vanilla SQL where子句文本字段。