数码资讯
PHP和SQL注入攻击预防技巧
下面是关于如何实现SQL注入攻击以及如何防止它的讨论。 看这个例子: 复制代码代码如下所示: 假定的输入 $name =ilia'delete用户;; mysql_query(从users名称={姓名}美元); 很明显,最终数据库执行命令: 从users名称=髂骨;删除用户 这给数据库带来灾难性后果
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
下面是关于如何实现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。
看这个例子:
复制代码代码如下所示:
假定的输入
$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。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。