教程 > sql 教程 > 阅读:40

sql 注入——迹忆客-ag捕鱼王app官网

如果通过网页获取用户输入并将其插入到 sql 数据库中,则有可能对称为sql 注入的安全问题比较敏感。本章将教你如何防止这种情况发生,并帮助你保护服务器端脚本(如 perl 脚本)中的脚本和 sql 语句。

注入通常发生在用户输入时,例如要求输入姓名,而用户输入的不是姓名,他们会输入一条 sql 语句,那么你将在不知不觉中在数据库上运行该sql语句。永远不要相信用户提供的数据,只有在验证后才处理这些数据;通常,这是通过模式匹配完成的。

在下面的示例中,名称被限制为字母数字字符加下划线和 8 到 20 个字符之间的长度(可以根据需要修改这些规则)。

if (preg_match("/^\w{8,20}$/", $_get['username'], $matches)) {
   $result = mysql_query("select * from customers 
      where name = $matches[0]");
} else {
   echo "user name not accepted";
}

为了演示这个问题,请看以下内容

$name = "qadir'; delete from customers;";
mysql_query("select * from customsrs where name='{$name}'");

该函数调用应该从 customers 表中检索一条记录,其中名称列与用户指定的名称相匹配。在正常情况下,$name将只包含字母数字字符和空格,例如字符串 'ilia'。但是在这里,通过向 $name 附加一个全新的查询,此时对数据库的调用就变成了一场灾难;注入的 delete 语句会从 customers 表中删除所有记录。

幸运的是,如果你使用 mysql,mysql_query()函数不允许查询堆叠或在单个函数调用中执行多个 sql 查询。否则,调用将失败。

但是,其他 php 数据库扩展,例如sqlite和postgresql,可以执行上述的sql语句,执行一个字符串中提供的所有sql语句,这会造成严重的安全问题。


防止 sql 注入

我们可以在 perl 和 php 等脚本语言中巧妙地处理所有转义字符。php 的 mysql 扩展提供了函数mysql_real_escape_string()来转义 mysql 特有的输入字符。

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("select * from customers where name='{$name}'");

like 的问题

为了解决 like 的问题,自定义转义机制必须将用户提供的 %_ 字符转换为文字。可以使用addcslashes()函数,该函数可让你指定要转义的字符范围。

$sub = addcslashes(mysql_real_escape_string("%str"), "%_");
// $sub == \%str\_
mysql_query("select * from messages 
   where subject like '{$sub}%'");

查看笔记

扫码一下
查看教程更方便
网站地图