假设管理员表( 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日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论