当使用thinkphp框架接受表达内容。
如果使用I函数获取表单数据,如I("data");这个数据是默认被过滤的。
默认的过滤方法
'DEFAULT_FILTER' => 'htmlspecialchars', // 默认参数过滤方法 用于I函数...
如果对输入的参数进行正则匹配,当遇到特殊字符时会出问题。
htmlspecialchars的反函数为htmlspecialchars_decode()。使用该函数可以把转义的参数再转回来。
但这并没有解决全部问题,因为不同版本的thinkphp的I函数是不一样的,而且DEFAULT_FILTER还可以设置别的值。
所以当我们确实需要获取原始数据而非转义数据时,还是使用最原始的 $_POST("PARAM");最靠谱。
但是这事还是没完。因为php里还有addslashes()函数他会过滤提交给php的参数。也就是用原始的$_POST依然要面对过滤的问题。
我可以通过get_magic_quotes_gpc()来判断是否开启了该过滤,并用stripslashes()反过滤。
不幸的是,不同版本里的php对该函数的支持依然不同,php6里该函数被取消了。
综上,你不得不再每个项目里去测试框架和php参数的过滤,以使项目按照您的意愿执行。
另外如果您的php框架使用的是gbk的编码的话,那么还会出现字符集转换的问题,但这并不代表使用utf-8字符集时不会有问题。
总之对于输入参数的过滤转义,和字符集的转化都是非常麻烦而且特例特测的事情。
测试技巧。
不要仅直接用输入和输出的方式来测试,因为这个过程可能经历了多个过滤。
使用在php文件中定义变量然后输出,测试输出没有问题,再测试$_POST,再测试I函数。
如果要确保输入的数据安全还是自己用正则表达是来过滤一般,这是最靠谱的啦。
其次I(函数)的安全性还是有的,一般情况尽量使用I(函数)
特别情况,尽量使用$_POST来处理,一方面是效率更高而且代码中区别对待可读性好,还有就是不必关心DEFAULT_FILTER参数的设置。
在php5中去反addslashes()的函数
//去掉在引号前面自动加的:单引号('),双引号("),反斜杠(\),和NULL
function deal_quote($str){
if(get_magic_quotes_gpc()) {
return stripslashes($str);
}
}
I(函数)过滤器 htmlspecialchars() & (和号)" (双引号) ' (单引号) < (小于) > (大于)
php中过滤器 addslashes() 单引号('),双引号("),反斜杠(\),和NULL