2016-11-25 122 views
0

我们目前正在开发一个功能,其中的一部分功能是允许用户为简单的选择语句定义一个where子句,这样他就可以通过GUI限制他想要得到的结果。Java:用户提供where子句:如何防止SQL注入?

表名可能有所不同,但它不过是一个“select * from TABLE_NAME”(我知道这是一个糟糕的主意,但客户是国王)。 由于这为SQL注入提供了无限的可能性,我一直在寻找可行的方法,至少在最后几天阻止最广泛使用的SQL注入技术,并且我找不到很多信息。大多数提示都基于假设,即用户只提供查询参数,可以通过PreparedStatements来解决。但在我的情况下,他们几乎没用。

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

  1. 定义,什么样的用户输入不能包含的基础上,广泛使用的SQL注入技术。
  2. 定义用户输入应该是什么样子。

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

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

如果你能向我推荐任何更好的技术,工具或方法,我将非常感激,因为正如我所提到的,在这个主题上没有太多的信息。

预先感谢您!

+0

基本上你的观点2:使用一些解析器生成器与已有的sql语法(我会使用antlr),使用它来验证并生成查询 –

+0

有现有的工具。也许Querydsl会做你想做的事情? – chrylis

回答

3

你正在建设一个SQL注入的应用

两件事情可以做:

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

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

有几种注射技术,可能很难全部获得它们。

+0

哈哈,那是我想到的,当我听到要求时。你能推荐一个简单的解析器来进行这种类型的文本分析吗?谢谢您的回答! –

+0

对不起,我不知道是不是一个人,但我认为你可以使用正则表达式在一个小时左右写一个。查找由AND连接在一起的子句,如t.col = number或t.col ='string'。将字符串限制为字母,数字,空格和其他几个字符。还要确保查询不是由具有删除,删除,插入等权限的用户执行的 – OneSolitaryNoob

+1

你们帮了我很多,谢谢!我投了你的答案,但他们会数,当我获得更多的积分。我也已经和系统架构师说过了,我们选择了一个你的建议选项:) –

0

我会考虑一个图形查询生成器UI而不是香草SQL where子句文本字段。

  • 举例来说,如果你这样做Java的,它只是可能不是这样一个大的工作创造出图形表示(与属性和诸如此类的东西巧妙的框),然后可映射到critera objects for Hibernate Criteria queries
  • 谁知道,您的客户可能会更感激图形查询生成器而不是纯文本字段,它需要SQL查询中的帮助+专业知识。
+0

这是一个正确的方式来实现这一点,我知道。如果客户将接受设计方面的一些变更,或限制简单的SQL限制,我将在下周与我们的系统架构师进行交流。好消息是,最终用户是不会看到该功能的,只有客户的管理员才能看到该功能。 –