SQL注入:验证SQL是否已正确参数化,并具有?它应该在哪里

时间:2013-09-27 23:03:41

标签: sql-injection

我构建的框架允许应用程序编码器动态创建sql(当需要时)。如果他们正确使用该工具,那么他们将分两步进行:1。使用'?'构建sql(PreparedStatement)占位符,以及2.将所有用户输入的数据作为参数传递给PreparedStatement。

这只是使用PreparedStatement和params的常用方法,以避免sql注入。没什么特别的。

但是,我想更进一步:我想验证编码器是否已正确“参数化”。在什么意义上可能,如果可能的话?一个人可以在句法上确定所有“?”的地方出现在SQL中?这样的工具是否已经存在?

编辑: 例如:

从x中选择blah 其中a ='用户数据' 和b =?

这里,a没有被参数化,而b有。我想检测'a'那种格式错误的sql。这有意义吗?

1 个答案:

答案 0 :(得分:1)

首先,你的一些场所存在缺陷 即

  • “传递所有用户输入的数据作为参数”是一种可靠的注入方式。当开发人员开始将他的数据分开为“安全”和“不安全”时,他就被破坏了。
  • 整个想法都行不通。有时我们必须在查询中添加常量字符串。而你永远无法判断这是不是一件坏事。

如果你不信任你的开发者那么多 - 有两种可能的万无一失的解决方案,以降低他将SQL用于某些有限子集的能力为代价:

我们的想法是限制您的开发人员只使用这些基于沙盒的解决方案(尽管如此,如果这样的限制可以开箱即可,请不要这样做。)

上述解决方案更接近您最初的想法和可行