7.1 SQL注入
(1)注入攻击的本质,是把用户输入的数据当做代码执行。有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。
(2)“盲注”,就是在服务器没有错误回显时完成的注入攻击。
(3)最常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行。
(4)利用BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种边信道攻击,这个技巧在盲注中被称为Timing Attack。

7.2 数据库攻击技巧
(1)SQL注入可以猜解出数据库的对应版本。
(2)在MySQL中,可以利用“用户自定义函数”的技巧,即UDF(User-Defined Function)来执行命令。
(3)一般来说,在数据库中执行系统命令,要求具有较高的权限。在数据库加固时,可以参阅官方文档给出的安全指导文档。
(4)在建立数据库账户时应该遵循“最小权限原则”,尽量避免给Web应用使用数据库的管理员权限。
(5)除了利用存储过程直接攻击外,存储过程本身也可能会存在注入漏洞。
(6)不同的字符编码也可能会导致一些安全问题。
(7)2008年8月,Stefan Esser提出了 “SQL Column Truncation”的攻击方式。

7.3 正确地防御SQL注入
(1)从防御角度考虑,要做的事情:找到所有的SQL注入漏洞;修补这些漏洞
(2)防御SQL注入的最佳方式:使用预编译语句,绑定变量
(3)使用存储过程:尽量避免在存储过程中使用动态的SQL语句。如果无法避免,则应该使用严格的输入过滤或者是编码函数来处理用户的输入数据。
(4)检查数据类型:限制输入数据的类型,数据格式和类型检查。
(5)使用安全函数:Web应用使用的数据库账户,不应该有创建自定义函数、操作本地文件的权限。

7.4其他注入攻击
(1)诸如XML注入、代码注入、CRLF注入等攻击方式

7.5 小结
(1)对抗注入攻击,牢记“数据与代码分离原则”,在“拼凑”处进行安全检查。