个性化阅读
专注于IT技术分析

什么是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子句的问题

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

$sub = addcslashes(mysql_real_escape_string("%something_"), "%_");
// $sub == \%something\_
mysql_query("select * from post where message like '{$sub}%'");
赞(0)
未经允许不得转载:srcmini » 什么是sql注入?一分钟快速理解mysql sql注入

评论 抢沙发

评论前必须登录!