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

rye*_*guy 6 php sanitization

这是参考这个(优秀的)答案.他指出,在PHP中逃脱输入最好的解决方法是调用mb_convert_encoding随后html_entities.

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

摘自原始答案:

即使您在HTML标记之外使用htmlspecialchars($ string),您仍然容易受到多字节字符集攻击向量的攻击.

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

$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

这有什么好处我不见了?

Ins*_*lah 7

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

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
Run Code Online (Sandbox Code Playgroud)

换一种说法: (C0 AE - header-bits) == '.'

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