首页 > 技术文章 > 防止SQL注入

clubs 2019-09-01 16:27 原文

一、防止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 & (和号)    成为 &amp;
2 
3 ” (双引号)  成为 &quot;
4 
5 ‘ (单引号)  成为 &#039;
6 
7 < (小于)    成为 &lt;
8 
9 > (大于)    成为 &gt;

htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符(和htmlspecialchars相反)。
函数原型:

1 htmlspecialchars_decode(string,quotestyle)

 

链接:https://mp.weixin.qq.com/s/E_N7AYeojASvwaRpEV6oWw

推荐阅读