sql注入及其防范
sql注入及其防范
工具/原料
sql注入及其防范
sql注入及其防范
1、假设管理员表( administrators )为:
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’]);..........最终,一个结论:用户都是坏蛋!