在PHP中采用魔术引号进行过滤,但是PHP5.4之后被取消了,同时在遇到int型注入也不会那么有效,所以用的最多的还是过滤函数和类(例如discuz,dedecms,phpcms),如果单纯的过滤函数写的不严谨,就会出现绕过的情况,最好的解决方法还是预编译的方式。
GPC/runtime魔术引号
数据污染有两种方式,一种是应用被动接受参数,类似于GET,POST等,还有一种是主动获取参数,类似于读取远程页面或文件等,GPC负责对GET,POST,COOKIE的值进行过滤,runtime对于从数据库或者文件中获取的数据进行过滤
这两个选项通常只能防护住部分SQL注入漏洞被利用,因为它们只对单引号,双引号,反斜杠与空字符进行过滤,在int型的注入上市没有多大作用的
过滤函数和类
- addslashes
过滤的值范围和GPC是一样的,即单引号 双引号 反斜杠 空字符,它只是一个简单的检查参数的函数,大多数程序使用它是在程序的入口,进行判断如果没有开启GPC,则使用它对$_POST/$_GET等变量进行过滤,不过它的参数值必须是string类型。
$str=”phpsafe'”;
echo addslashes($str);
结果:
phpsafe\’
- mysql_real_escape_string:
mysql_escapde_string和mysql_real_escape_string函数都是对字符串进行过滤,[\x00][\n][\r][\][‘][“][\x1a]等字符会受到影响。
两个函数唯一不一样的地方在于mysql_real_escape_string接受的是一个连接句柄并根据当前字符集转义字符串,所以推荐使用mysql_real_escape_string
- intval字符转换
上面的过滤方式在遇到int类型注入的时候效果并不好,可以通过报错或者盲注等方式来绕过,intval方式可以将变量转化成int类型,利用参数白名单的方式来防止漏洞,对应的还有其他的方式例如floatval等等
$id = intval(“1 union select”);
echo $id;
结果:1