sql注入及其防范

幸运草 2020年3月31日21:28:13安全防范评论阅读模式

假设管理员表( administrators )为:

登录表单类似这样:

<form  action=”check.php”  method=”post”>

用户名:<input type=”text”  name=”user”  />

用户名:<input type=”password”  name=”pass”  />

<input  type=”submit”  value=”登录”  />

</form>

则后台登录验证程序(check.php)类似这样:

$user = $_POST[‘user’];

$pass = $_POST[‘pass’];

$sql  =  “select  *  from  administrators where  admin_user = ‘$user’  and  admin_pass = ‘$pass’  “;

$result = mysql_query($sql);

if($result === false){//执行错误

echo “登录失败”;

}

else{

$count  = mysql_num_row($result);//数据条数

if($count  == 1){

echo “登录成功”;

}

else{

echo  “登录失败”;

}

}

看这个程序,似乎天衣无缝。

但:

万能用户名的使用:

请看我填写一个“万能用户名”:  admin’#

密码随便(比如111)。则该sql语句就变成类似这样:

$sql = “select  *  from  administrators where  admin_user = ‘admin’#’  and  admin_pass = ‘111’  “;

此时,该语句,就可以轻松进入系统。

万能密码的使用:

再看我填写一个“万能密码”: ‘ or 1 or ‘

用户名随便(比如aaa)。则该sql语句就变成类似这样:

$sql = “select * from  administrators where  admin_user = ‘aaa’  and  admin_pass = ‘’ or 1 or  ‘’  “;

此时,该语句,就可以找出所有数据——而当前有正好只有条语句。

解决办法:

基本上,罪魁祸首,都是单引号,因为单引号在sql语法中是一个“特殊字符”:用于字符串的形式符号。

sql语句中,也会有其他一些特殊字符,比如:”(双引号)#-- (两个中杠)

则,我们都需要对这些用于sql语句执行中的符号,进行“转义”。

基本上,就是这些漏洞的出现,都是在sql语句中,有用户的“输入信息”。

我们只要对“所有用户输入信息”,进行这些符号的转义,就可以避免。

做法:

$data1 = addslashes( $_POST[‘表单名1’]);

$data2 = addslashes( $_POST[‘表单名2’]);

..........

本文来源于:sql注入及其防范-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草

发表评论