HTML Purifier - 字符编码

HTML Purifier - Character Encoding

提问人:testtesttesteettesttesttesttes 提问时间:4/11/2022 最后编辑:veetesttesttesteettesttesttesttes 更新时间:4/12/2022 访问量:331

问:

我计划将 HTML Purify 用于我的 Web 服务的输出。我没有看到集成的“登录”功能来检查替换的内容,所以我自己编写了它。

但是,purifier() 函数会自动转换我的特殊字符“entities”。

例如:

& -> &

ø -> ø 

现在的问题是,这些也将被“记录”,因为我的日志记录函数比较了“纯化”字符串和原始字符串之间的差异。有没有办法避免这种自动编码/解码,或者有没有人知道如何检查实际替换的内容?

谢谢!

php 字符编码 xss htmlpurifier

评论

1赞 JosefZ 4/11/2022
编辑您的问题以分享一个最小的可重现示例

答:

0赞 pinkgothic 4/12/2022 #1

您引用的两个示例实际上是两个不同的用例;一个是因为 HTML Purifier 使你的输出安全 (),另一个是使用 UTF-8 而不是实体的 HTML Purifier,因为这是它的内部表示。& -> &

一般来说,如果你的 HTML 是安全的,HTML Purifier 将输出语义上等效的 HTML,它实际上并不能保证保留所有空格或表示形式,因为它的重点完全是安全性,而不是安全 HTML 的幂等性,并且它为了彻底分析而大量转换传入的 HTML。

您可以强制它始终使用 Core.EscapeNonASCIICharacters 将所有非 ASCII 字符转换为实体,但我怀疑这是您想要的 - 它还会将任何当前不是实体的 UTF-8 更改为实体。它也没有解决未转义的 HTML 特殊字符将被转义的问题 () - HTML Purifier 不会冒险,因此即使是那些巧合/上下文安全的 HTML 特殊字符也将始终被编码。& -> &

相反,请查看 Core.CollectErrors。这应该可以检查您正在寻找的更改。尽管文档中有警告,但它是一个可靠的功能。您可以在此处查看该功能的示例用法。tl;dr 是要获取错误收集器,请使用 ,并获取错误列表(包括替换),.试试看它是否有效?$purifier->context->get('ErrorCollector');$errorCollector->getRaw()

评论

0赞 testtesttesteettesttesttesttes 4/12/2022
非常感谢!我会马上尝试一下。我目前使用 PHP 函数 html_entity_decode() 来比较原始字符串和纯化字符串以及日志差异(如果有)。这仅适用于内部日志记录,而我只使用纯化的字符串进行输出。你认为这是一个“足够好”的做法吗?一般来说,我只想记录哪些信息实际被删除,并且由于净化而不会显示在我的网络服务的输出中。
0赞 pinkgothic 4/13/2022
由于 HTML Purifier 在保留空格方面也没有任何保证,因此我真的建议您改为研究 Core.CollectErrors。也就是说,如果你的当前方法没有得到误报,你的方法应该没问题,只要你不要在没有其他保护措施(例如htmlspecialchars())的情况下在Web浏览器中呈现它。