提问人:Barry Austin 提问时间:10/14/2008 最后编辑:Barry Austin 更新时间:2/25/2019 访问量:5211
PHP 中严格的 HTML 验证和过滤
Strict HTML Validation and Filtering in PHP
问:
我正在寻找对用户提交的 HTML 执行严格(白名单)验证/过滤的最佳实践。
主要目的是过滤掉可能通过 Web 表单输入的 XSS 和类似的讨厌内容。次要目的是限制非技术用户输入的 HTML 内容的损坏,例如通过具有 HTML 视图的所见即所得编辑器。
我正在考虑使用 HTML 净化器,或者通过使用 HTML DOM 解析器来完成 HTML(dirty)->DOM(dirty)->filter->DOM(clean)->HTML(clean) 等过程。
您能描述一下这些或任何更简单的策略的成功吗?有什么需要注意的陷阱吗?
答:
用户提交的 HTML 并不总是有效的,或者确实是完整的。浏览器会解释各种无效的 HTML,您应该确保可以捕获它。
还要注意有效的外观:
<img src="http://www.mysite.com/logout" />
和
<a href="javascript:alert('xss hole');">click</a>
评论
W3C 有一个用于验证 HTML 的大型开源包,可在此处获得:
您可以自己下载软件包,并可能实现他们正在执行的任何操作。不幸的是,似乎很多 DOM 解析器似乎都愿意弯曲规则来“在野外”分配 HTML 代码,所以让大师告诉你出了什么问题,而不是把它留给一个更实用的工具是个好主意——有很多网站并不完美, 兼容的 HTML,但我们仍然每天都在使用。
评论
我已经在 HTML Purifier 上测试了我所知道的所有漏洞,它做得很好。它不仅过滤 HTML,还过滤 CSS 和 URL。
一旦你把元素和属性缩小到无辜的元素和属性,陷阱就出在属性内容上——伪URL(IE允许在协议名称中使用制表符 - 仍然有效)和触发JS的CSS属性。javascript:
java	script:
解析 URL 可能很棘手,例如,这些 URL 是有效的:或 .
国际化域名 (IDN) 可以通过两种方式编写——Unicode 和 punycode。http://spoof.com:[email protected]
//evil.com
使用 HTML Purifier – 它已经解决了其中的大部分问题。如果您只想修复损坏的 HTML,请使用 HTML Tidy(它可作为 PHP 扩展)。
评论
我成功地使用了 HTML Purifier,并且没有任何 xss 或其他不需要的输入过滤器通过。我还通过 Tidy 扩展运行 sanitize HTML,以确保它也能验证。
评论