六个建议防止 SQL 注入式攻击
一、 SQL 注入攻击的简单示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面这条语句是很普通的一条 SQL 语句,他主要实现的功能就是让用户输
入一个员工编号然后查询处这个员工的信息。但是若这条语句被不法攻击者改
装过后,就可能成为破坏数据的黑手。如攻击者在输入变量的时候,输入以下
内容 SA001’;drop table c_order--。那么以上这条 SQL 语句在执行的时候就
变为了 SELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
这条语句是什么意思呢?‘SA001’后面的分号表示一个查询的结束和另一
条语句的开始。c_order 后面的双连字符指示当前行余下的部分只是一个注
释,应该忽略。如果修改后的代码语法正确,则服务器将执行该代码。系统在
处理这条语句时,将首先执行查询语句,查到用户编号为 SA001 的用户信息。
然后,数据将删除表 C_ORDER(如果没有其他主键等相关约束,则删除操作就会
成功)。只要注入的 SQL 代码语法正确,便无法采用编程方式来检测篡改。因
此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL 命
令的代码。
二、 SQL 注入攻击原理。
可见 SQL 注入攻击的危害性很大。在讲解其防止办法之前,数据库管理员
有必要先了解一下其攻击的原理。这有利于管理员采取有针对性的防治措施。
SQL 注入是目前比较常见的针对数据库的一种攻击方式。在这种攻击方式
中,攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符
串传递到 SQLServer 数据库的实例中进行分析和执行。只要这个恶意代码符合
SQL 语句的规则,则在代码编译与执行的时候,就不会被系统所发现。
SQL 注入式攻击的主要形式有两种。一是直接将代码插入到与 SQL 命令串
联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种
方法。由于其直接与 SQL 语句捆绑,故也被称为直接注入式攻击法。二是一种
间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符
串。在存储的字符串中会连接到一个动态的 SQL 命令中,以执行一些恶意的
SQL 代码。
注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如
以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前
的语句。然后再插入一个恶意 SQL 语句即可。由于插入的命令可能在执行前追