为什么要调用mb_convert_encoding来清理文本?

时间:2009-09-11 17:23:07

标签: php sanitization

这是参考this (excellent) answer。他指出,在PHP中转义输入的最佳解决方案是调用mb_convert_encoding,然后调用html_entities

但是为什么你会使用相同的to和from参数(UTF8)调用mb_convert_encoding?

摘自原始答案:

  

即使您在HTML标记之外使用htmlspecialchars($ string),您仍然容易受到多字节字符集攻击媒介的攻击。<​​/ p>      

最有效的方法是使用mb_convert_encoding和htmlentities的组合,如下所示。

$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');

这是否有某些我缺少的好处?

1 个答案:

答案 0 :(得分:7)

并非所有二进制数据都是有效的UTF8。使用相同的from / to编码调用mb_convert_encoding是一种确保正在处理给定编码的正确编码字符串的简单方法。

rfc2279的第6节(安全注意事项)中描述了一种利用UTF8验证遗漏的方法:

  

另一个例子可能是解析器   禁止八位字节序列2F 2E 2E 2F(“/../”),但允许   非法八位位组序列2F C0 AE 2E 2F。

通过检查二进制表示可以更容易理解:

110xxxxx 10xxxxxx # header bits used by the encoding
11000000 10101110 # C0 AE
         00101110 #    2E the '.' character

换句话说:(C0 AE - header-bits) == '.'

正如引用的文字指出的那样,C0 AE不是有效的UTF8八位位组序列,因此mb_convert_encoding会将其从字符串中删除(或将其翻译为'.'或其他内容:-)