上一章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}%'");
推荐阅读
- mysql开发细节(使用自动递增序列以及处理重复数据)
- mysql复制表操作和数据库元数据介绍
- mysql alter命令和mysql索引介绍
- mysql事务操作介绍和临时表的使用
- mysql基本增删改查、所有查询子句以及连接查询完全解读
- MySQL开发教程(数据类型、数据库连接、基本数据库和表操作详解)
- MySQL基本管理介绍和在PHP中使用MySQL
- MySQL学习笔记(入门介绍和安装教程(linux和windows平台))
- 数据库|破解数据库内核人才困局(PingCAP 的思考与尝试丨Talent Plan 专访)