什么是sql注入(一分钟快速理解mysql sql注入)

上一章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子句的问题【什么是sql注入(一分钟快速理解mysql sql注入)】为了解决like子句的问题,自定义转义机制必须将用户提供的%和_字符转换为文字,我们可以使用addcslashes()函数,该函数允许你指定要转义的字符范围。
$sub = addcslashes(mysql_real_escape_string("%something_"), "%_"); // $sub == \%something\_ mysql_query("select * from post where message like '{$sub}%'");

    推荐阅读