PHP SQL注入漏洞防范

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27868757/article/details/84072395

在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

猜你喜欢

转载自blog.csdn.net/qq_27868757/article/details/84072395