我对SQL注入攻击的所有了解似乎都表明,参数化查询(尤其是存储过程中的参数化查询)是防范此类攻击的唯一方法。在我工作的时候(回到黑暗时代),存储过程被认为是一种不好的做法,主要是因为它们的可维护性较差。可测试性较低;高度耦合;并将系统锁定在一个供应商中;(此问题涵盖其他一些原因)。
尽管在我工作时,项目实际上并没有意识到这种攻击的可能性。采用了各种规则来保护数据库免受各种损坏。这些规则可以概括为:
- 没有客户端/应用程序可以直接访问数据库表。
- 对所有表的所有访问都是通过视图进行的(对基本表的所有更新都是通过触发器进行的)。
- 所有数据项都有指定的域。
- 不允许任何数据项为空-这意味着DBA有时会磨牙。但被执行了。
- 角色和权限已适当设置-例如,受限制的角色仅授予视图更改数据的权利。
那么,这样的一组(强制)规则(尽管不一定是特定的一组)是否可以替代参数化查询,以防止SQL注入攻击?如果没有,为什么不呢?可以通过(仅)数据库特定措施来保护数据库免受此类攻击吗?
编辑
鉴于收到的初步答复,对该问题的重视程度略有变化。基本问题不变。
编辑2
依赖参数化查询的方法似乎只是防御系统攻击的外围步骤。在我看来,更基本的防御措施既可取,又可能使对此类查询的依赖变得不必要或不太关键,甚至可以专门防御注入攻击。
我的问题中隐含的方法基于“加固”数据库,我不知道它是否是可行的选择。进一步的研究表明存在这样的方法。我发现以下来源提供了一些指向这种方法的指针:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
我从这些来源获得的主要特征是:
- 广泛的数据字典,与广泛的安全数据字典相结合
- 从数据字典生成触发器,查询和约束
- 最小化代码并最大化数据
尽管我到目前为止所获得的答案非常有用,并指出了忽略参数化查询所带来的困难,但最终它们并没有回答我的原始问题(现在以粗体强调)。