-1

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

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

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

编辑:示例:

从 x 中选择 blah,其中 a='user-data' 和 b=?

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

4

1 回答 1

1

首先,你的一些前提是有缺陷的。

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

如果您不太信任您的开发人员-有两种可能的万无一失的解决方案,其代价是将他使用 SQL 的能力降低到某个有限的子集:

这个想法是将您的开发人员仅限于这些基于沙盒的解决方案(但不知道这种限制是否可以开箱即用)。

以上方案更接近你的初步设想,可行

于 2013-09-28T06:05:38.760 回答