一、防止SQL注入
什么是SQL注入攻击?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
寻找SQL注入的方法:
1.通过get请求
2.通过post请求
3.其他http请求,如cookie
常见的SQL注入问题:数据库查询参数的类型转换处理
1. 转义字符处理不当
Talk is cheap,Show me the code.
多说无益,代码亮出来吧!
1 // 构造动态SQL语句 2 $sql = "select * from tbl where field = '$_GET['input']'"; 3 4 // 执行SQL语句 5 $res = mysql_query($sql);
测试:
在下边的网址后边加一个单引号,就会报数据库错误
http://testphp.vulnweb.com/ar...
2. 类型处理不当
1 // 构造动态SQL语句 2 $sql = "select * from tbl where field = $_GET['user_id']"; 3 4 // 执行SQL语句 5 $res = mysql_query($sql);
Mysql内置了一个命令,可以读取文件
1 Union all select load_file('/etc/passwd')-- 2 3 select * from tbl where userid = 1 union all select load_file('etc/passwd')--
该命令会获取数据库管理员的密码。
处理方法:
需要将客户端传过来的数据进行类型强制转换,而后再查询
1 $user_id = (int)$_GET['user_id']; 2 3 "select * from tbl where userid = {$user_id}";
3. 查询语句组织不当
1 user.php?table=user&
4. 错误处理不当
即将站点的错误信息暴漏给用户,这样非常危险。
1 // 构造动态查询语句 2 3 $getid = "select * from tbl where userid > 1"; 4 5 // 执行SQL语句 6 7 $res = mysql_query($getid) or die('<pre>'.mysql_error().'</pre>'); 8 9 5. 多个提交处理不当 10 11 // 参数是否是一个字符串 12 13 if(is_string($_GET["param"])){}
数据入库时将转换单引号、双引号、反斜杠为实体
在入库的时候如果不过滤 ' ""这样的东西,这样会使数据库报错,或者注入等问题。
先将字符串用htmlspecialchars()转换为实体后存储到数据库,然后从数据库读出来时htmlspecialchars_decode()转为HTML标签。
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
函数原型:
1 htmlspecialchars(string,quotestyle,character-set)
预定义的字符是:
1 & (和号) 成为 & 2 3 ” (双引号) 成为 " 4 5 ‘ (单引号) 成为 ' 6 7 < (小于) 成为 < 8 9 > (大于) 成为 >
htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符(和htmlspecialchars相反)。
函数原型:
1 htmlspecialchars_decode(string,quotestyle)
链接:https://mp.weixin.qq.com/s/E_N7AYeojASvwaRpEV6oWw