PHP中严格的HTML验证和过滤

时间:2008-10-13 21:00:05

标签: php html security validation xss

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

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

我正在考虑使用HTML Purifier,或者通过使用HTML DOM解析器来完成HTML(脏) - > DOM(脏) - > filter-> DOM(清洁) - > HTML(干净)

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

4 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:5)

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

还要注意看起来有效:

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

W3C有一个用于验证HTML的大型开源软件包:

http://validator.w3.org/

您可以自己下载软件包,也可以实现他们正在做的任何事情。不幸的是,似乎很多DOM解析器似乎都愿意弯曲规则来分配“野外”的HTML代码,所以让主人告诉你什么是错的而不是留给它是个好主意。一个更实用的工具 - 有很多网站不是完美,符合标准的HTML,但我们仍然每天使用。