6

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

但是为什么你会用相同的参数(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');

这有什么我缺少的好处吗?

4

1 回答 1

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会将其从字符串中删除(或将其翻译为'.', 或其他内容:-)。

于 2009-09-11T21:06:06.967 回答