17

我正在寻找对用户提交的 HTML 执行严格(白名单)验证/过滤的最佳实践。

主要目的是过滤掉可能通过 Web 表单输入的 XSS 和类似的恶意软件。次要目的是限制非技术用户输入的 HTML 内容的破坏,例如通过具有 HTML 视图的 WYSIWYG 编辑器。

我正在考虑使用HTML Purifier,或者通过使用 HTML DOM 解析器来完成我自己的流程,例如 HTML(dirty)->DOM(dirty)->filter->DOM(clean)->HTML(clean)。

你能描述这些或任何更简单有效的策略的成功吗?有什么需要注意的陷阱吗?

4

4 回答 4

9

我已经在 HTML Purifier 上测试了我所知道的所有漏洞,它做得很好。它不仅过滤 HTML,还过滤 CSS 和 URL。

一旦你将元素和属性缩小到无害的元素和属性,缺陷就在于属性内容——javascript:伪 URL(IE 允许协议名称中的制表符——java	script:仍然有效)和触发 JS 的 CSS 属性。

URL 的解析可能很棘手,例如这些是有效的:http://spoof.com:xxx@evil.com//evil.com. 国际化域 (IDN) 可以用两种方式编写——Unicode 和 punycode。

使用HTML Purifier——它已经解决了大部分问题。如果您只想修复损坏的 HTML,请使用 HTML Tidy(可作为 PHP 扩展使用)。

于 2008-10-13T21:39:12.040 回答
5

用户提交的 HTML 并不总是有效的,或者确实是完整的。浏览器会解释大量无效的 HTML,你应该确保你能捕捉到它。

还要注意有效的外观:

<img src="http://www.mysite.com/logout" />

<a href="javascript:alert('xss hole');">click</a>
于 2008-10-13T21:19:54.060 回答
1

我成功使用了 HTML Purifier,并且没有通过任何 xss 或其他不需要的输入过滤器。我还通过 Tidy 扩展运行净化 HTML 以确保它也可以验证。

于 2008-10-13T22:08:31.310 回答
-1

W3C 有一个用于验证 HTML 的大型开源包,可在此处获取:

http://validator.w3.org/

您可以自己下载该软件包,并可能实现他们正在做的任何事情。不幸的是,似乎很多 DOM 解析器似乎愿意改变规则来“在野外”分配 HTML 代码,所以最好让大师告诉你哪里出了问题,而不是让其自行处理。一个更实用的工具——有很多网站并不完美,不兼容 HTML,但我们仍然每天都在使用。

于 2008-10-13T21:35:25.293 回答