PHP 中严格的 HTML 验证和过滤

Strict HTML Validation and Filtering in PHP

提问人:Barry Austin 提问时间:10/14/2008 最后编辑:Barry Austin 更新时间:2/25/2019 访问量:5211

问:

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

主要目的是过滤掉可能通过 Web 表单输入的 XSS 和类似的讨厌内容。次要目的是限制非技术用户输入的 HTML 内容的损坏,例如通过具有 HTML 视图的所见即所得编辑器。

我正在考虑使用 HTML 净化器,或者通过使用 HTML DOM 解析器来完成 HTML(dirty)->DOM(dirty)->filter->DOM(clean)->HTML(clean) 等过程。

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

PHP HTML 安全 验证 XSS

评论


答:

5赞 Ross 10/14/2008 #1

用户提交的 HTML 并不总是有效的,或者确实是完整的。浏览器会解释各种无效的 HTML,您应该确保可以捕获它。

还要注意有效的外观:

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

<a href="javascript:alert('xss hole');">click</a>

评论

0赞 Barry Austin 10/14/2008
感谢 Ross,这些都是应该过滤掉的输入的极好例子。但我正在寻找的答案也将包括方法和解决方案。
0赞 Bobby Jack 10/14/2008
第一个例子(这是对一篇编码恐怖文章的引用:codinghorror.com/blog/archives/001171.html)并不真正相关,因为“洞”取决于该 URL 的性质,而不是这个特定 HTML 代码段的语法。
0赞 Barry Austin 10/15/2008
仍然有一些有用的规则可以应用于第一个规则,例如,仅当 src 属性与正则表达式 /^http:///\/localsite.com\/uploaded_images\/[\w-]*\ 匹配时,才允许 <img> 标记。(png|jpg|gif)$/i”。
-1赞 Robert Elwell 10/14/2008 #2

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

http://validator.w3.org/

您可以自己下载软件包,并可能实现他们正在执行的任何操作。不幸的是,似乎很多 DOM 解析器似乎都愿意弯曲规则来“在野外”分配 HTML 代码,所以让大师告诉你出了什么问题,而不是把它留给一个更实用的工具是个好主意——有很多网站并不完美, 兼容的 HTML,但我们仍然每天都在使用。

评论

3赞 Kornel 10/14/2008
针对 DTD 的验证根本无法防止 XSS。
0赞 Ross 10/14/2008
确切地说,我不认为这就是 Barry 所说的验证的意思——想想数据验证或筛选,而不是标准验证。这将有助于防止格式错误的 HTML ;)
8赞 Kornel 10/14/2008 #3

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

一旦你把元素和属性缩小到无辜的元素和属性,陷阱就出在属性内容上——伪URL(IE允许在协议名称中使用制表符 - 仍然有效)和触发JS的CSS属性。javascript:java&#09;script:

解析 URL 可能很棘手,例如,这些 URL 是有效的:或 . 国际化域名 (IDN) 可以通过两种方式编写——Unicode 和 punycode。http://spoof.com:[email protected]//evil.com

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

评论

2赞 Cheekysoft 9/1/2011
事实证明,它在 2008 年远非安全,这些漏洞是在 2011 年发现的: secunia.com/advisories/43907, 2010: secunia.com/advisories/39613 教训:请务必始终更新过滤器安装。
1赞 Oscar M. 10/14/2008 #4

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