sql注入及其防范

2025-11-03 14:38:50

1、假设管理员表( administrators )为:

sql注入及其防范

2、登录表单类似这样:

<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’]);

..........

最终,一个结论:用户都是坏蛋!

 

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢