牛骨文教育服务平台(让学习变的简单)
博文笔记

thinkphp 页面提交参数的过滤(转义)

创建时间:2016-07-19 投稿人: 浏览次数:235

当使用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 实体是:

  • &amp; 解码成 & (和号)
  • &quot; 解码成 " (双引号)
  • " 解码成 " (单引号)
  • &lt; 解码成 < (小于)
  • &gt; 解码成 > (大于)

htmlspecialchars_decode() 函数是 htmlspecialchars() 函数的反函数。


语法

htmlspecialchars_decode(string,flags)
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。