在我看来,可以通过以下方式防止SQL注入攻击:
- 仔细筛选,过滤和编码输入(在插入SQL之前)
- 使用准备好的语句 /参数化查询
我想每个都有优点和缺点,但是为什么#2脱颖而出,或多或少地被认为是防止注入攻击的实际方法?是更安全,更不容易出错,还是还有其他因素?
据我了解,如果正确使用#1并注意所有警告,它可能与#2一样有效。
消毒,过滤和编码
在清除,过滤和编码的含义上,我感到有些困惑。我要说的是,出于我的目的,以上所有选项都可以考虑作为选项1。在这种情况下,我了解到清理和过滤有可能修改或丢弃输入数据,而编码可以按原样保留数据,但可以对其进行编码适当避免注射攻击。我认为转义数据可以视为对数据进行编码的一种方式。
参数化查询与编码库
有一些答案,其中parameterized queries
和的概念encoding libraries
可以互换使用。如果我错了,请指正我,但我印象深刻的是它们是不同的。
我的理解是encoding libraries
,无论多么出色,他们总是有潜力修改SQL“程序”,因为在发送给RDBMS之前,他们正在对SQL本身进行更改。
Parameterized queries
另一方面,将SQL程序发送到RDBMS,然后优化查询,定义查询执行计划,选择要使用的索引等,然后插入数据,作为RDBMS内部的最后一步本身。
编码库
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
参数化查询
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
历史意义
一些答案提到,从历史上看,出于性能原因创建参数化查询(PQ),并且在针对编码问题的注入攻击变得流行之前。在某些时候,很明显PQ对注入攻击也很有效。为了符合我的问题的精神,为什么在防止SQL注入攻击时PQ仍然是首选方法,为什么它比大多数其他方法蓬勃发展?