下面是关于如何实现SQL注入攻击以及如何防止它的讨论。

看这个例子:
复制代码代码如下所示:
假定的输入
$name =ilia'delete用户;;
mysql_query(从users名称={姓名}美元);

很明显,最终数据库执行命令:

从users名称=髂骨;删除用户

这给数据库带来灾难性后果——所有记录都被删除了。

但如果你使用的数据库是MySQL,好的,mysql_query()函数不允许直接执行这样的操作(不是单线多表操作),所以你可以放心,如果你使用一个数据库,SQLite或PostgreSQL支持这样的声明,那么你将面临一场灾难。

正如上面提到的,SQL注入是主要提交安全数据为攻击目的数据库。为了防止SQL注入攻击,PHP函数来处理输入的字符串,它可以处理在较低层次的安全,即输入魔术引号。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,单引号、双引号,并输入字符串中的一些字符将被自动添加到反斜杠之前。

但是魔术引号不是一个很一般的解决方案,它不会屏蔽所有潜在危险的字符,而且很多服务器上都没有启用魔法引号,因此,我们还需要使用各种其他方法来防止SQL注入。

许多数据库本身提供的输入数据处理功能。例如,有一个功能叫做mysql_real_escape_string()在PHP MySQL操作功能,可将特殊字符和字符,可能导致错误的数据库操作。

看看这个代码:
复制代码代码如下所示:
如果启用了魔术引号函数
如果(get_magic_quotes_gpc()){
$name = stripslashes($name);
其他{ }
$name = mysql_real_escape_string($name);
}

mysql_query(从users名称={姓名}美元);

注意,在使用函数的数据库决定是否打开魔法引号之前,如上例中所示,否则错误将重复两次处理。如果MQ已启用,我们需要删除添加的获取实际数据。

除了数据预处理在上面的字符串的形式,我们还应注意预处理时,存储二进制数据到数据库中。否则,该数据可能与数据库本身的存储格式冲突,导致数据库崩溃,数据记录丢失,甚至整个图书馆的资料。一些数据库,如PostgreSQL,提供一个功能pg_escape_bytea(),这是用来编码的二进制数据。它可以进行数据编码类似base64。

如:
复制代码代码如下所示:
使用纯文本数据
pg_escape_string($ regular_strings);

二进制数据的使用:
pg_escape_bytea($ binary_data);

在另一种情况下,我们也必须采用这样一种机制,即数据库系统不支持的多字节语言,如中文、日文等,有些ASCII范围与二进制数据的范围相重叠。

但是,编码数据可能会导致查询语句失败,比如ABC。