thinkphp 页面提交参数的过滤(转义)
当使用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
参考内容
http://www.runoob.com/php/func-string-htmlspecialchars-decode.html
http://www.runoob.com/php/func-string-stripslashes.html
http://www.php100.com/html/php/hanshu/2013/0905/4689.html
http://www.runoob.com/php/func-string-addslashes.html
htmlspecialchars_decode()
定义和用法
htmlspecialchars_decode() 函数把一些预定义的 HTML 实体转换为字符。
会被解码的 HTML 实体是:
- & 解码成 & (和号)
- " 解码成 " (双引号)
- " 解码成 " (单引号)
- < 解码成 < (小于)
- > 解码成 > (大于)
htmlspecialchars_decode() 函数是 htmlspecialchars() 函数的反函数。
语法
- 上一篇: 阿里十大开源项目,看看你用过几个
- 下一篇: C++ 用new 动态创建多维数组