SQL注入原理和预防(未完善)

2018-03-06 09:55:00
linefo
原创
797


本文实际处理方式依据PHP实现。

要求有一定基础的SQL语句知识。


SQL注入的原理


SQL注入就是攻击者利用开发者在程序编写上的不严谨,通过输入数据执行了他自己的SQL语句。


先说一个实际的应用场景。

用户通过订单号查询订单详情,我们写的程序可能会执行这样的语句:SELECT * FROM `order` WHERE `order_id` = [用户输入的订单号];

其中”[用户输入的订单号]“这部分是由用户输入的,普通用户当然只会输入订单号,但攻击者想操作你的数据库,他可能会通过在输入内容中加入SQL语句,将你实际执行的语句变成这样:

SELECT * FROM `order` WHERE `order_id` = [用户输入的订单号];DROP TABLE `order`;

上面红字部分如果不加以过滤,则会成为有效的SQL语句,执行完后你的订单表就被删除了。


主要有两种手段防止SQL注入


过滤和检查


过滤/检查是比较常用的方式,但总有考虑不到的情况,所以不能保证一定能够防止。

提供几个过滤的思路:


【格式检查】


检查变量类型;比如传入订单号这种,如果数据库设计时该字段都是数字类型,那么在程序中应该校验用户输入的值是否是数字。

检查数据格式;比如需要用户传入邮箱,就检查是否符合邮箱格式。


通过上面的方式,已经能在很大程度上避免SQL注入攻击。


【过滤特殊符号】


通常我们还会进行一些特殊符号的过滤(注意和上面的格式检查配合好,不要互相冲突),在PHP中,通常是采用addslashes函数。

addslashes会在 单引号(')、双引号(")、反斜杠(\)、NULL 这四个预定义字符前添加反斜杠,从而对他们进行转义。

一般来说,都需要加该函数过滤用户输入的值(具体用处多大还要看程序实现的逻辑),转义的值不会影响程序中一般SQL语句的正常执行。


PS:

在PHP < 5.4的版本中,PHP.ini中有个magic_quotes_gpc配置项,开启之后会自动对GET、POST、COOKIE进行转义(等同加上addslashes),通过get_magic_quotes_gpc()可以检测开启情况。在这种版本下,要注意不要进行两次转义。

在5.4版本开始,该配置项被移除,这些数据不会被自动转义,也就是说转义与否完全交由程序中自己决定。


PS:

这里讲一下实际转义的处理情况

(1)SELECT * FROM `order` WHERE `order_id` = [用户输入的订单号];

(2)SELECT * FROM `order` WHERE `order_id` = '[用户输入的订单号]';


黑客一般是不可能知道程序的具体实现逻辑的,所以只能靠猜测和不断尝试去进行SQL注入,上面被执行的两条语句中,第二条语句的安全性要高。因为加了单引号,攻击者想要成功执行语句,首先要考虑闭合前面的单引号,如果使用了addslashes函数转义,那么攻击者就无法通过自加的单引号去进行闭合。

而对第一条语句而言,攻击者不需要考虑闭合单引号,他可以先加 ; 去隔开语句,在输入自己的SQL代码,此时addslashes函数就无法起到作用了。


参数化查询


这个方式基本能防止SQL注入,会增加程序开发的工作量,后面补充。


PHP本身的防御机制


PHP中查询函数不允许一次执行多条SQL语句。


其他


必须要关闭程序的错误提示(这个不止针对SQL注入),否则通过错误提示,攻击者攻击成功的难度会低很多。

最后编辑:linefo 于 2018-03-06 10:25:52

关键字

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277