一、防止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('
'.mysql_error().'');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