上一章mysql教程中我们学习了mysql复制表和数据库元数据的相关内容,现在我们开始花费一分钟的时间理解mysql sql注入。
一、什么是sql注入?
如果你通过一个网页获取用户输入并将其插入到一个MySQL数据库中,那么你可能会遇到一个称为SQL注入的安全问题。
例如登录模块中需要用户提供用户名和密码,但是如果用户提供相关信息中包含了一些sql语句,这些非法的sql语句有可能被执行。
在下面的示例中,用户名限制为字母数字字符加下划线,长度限制为8到20个字符—根据需要修改这些规则。
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) {
$result = mysql_query("select * from users where username = $matches[0]");
} else {
echo "Error";
}
为了演示这个问题请考虑下面的引用。
// 期望的输入
$name = "pname'; delete from users;";
mysql_query("select * from users where name = '{$name}'");
函数调用应该从users表中检索一条记录,其中name列与用户指定的名称匹配。在正常情况下$name只包含字母数字字符和空格,但是在这里,通过将一个全新的查询附加到$name对数据库的调用变成了删除users的所有记录。
二、防止sql注入
PHP中的MySQL扩展提供了mysql_real_escape_string()函数来处理输入字符防止sql注入。
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("select * from users where name = '{$name}'");
三、like子句的问题
为了解决like子句的问题,自定义转义机制必须将用户提供的%和_字符转换为文字,我们可以使用addcslashes()函数,该函数允许你指定要转义的字符范围。
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("select * from post where message like '{$sub}%'");
评论前必须登录!
注册