2008-10-13 51 views
17

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

主要目的是过滤可能通过网页表单输入的XSS和类似的垃圾。次要目的是限制由非技术用户输入的HTML内容的破坏,例如通过具有HTML视图的所见即所得编辑器。我正在考虑使用HTML Purifier,或者通过使用HTML DOM解析器来滚动我自己的过程,如HTML(dirty) - > DOM(dirty) - > filter-> DOM(clean) - > HTML(清洁)。

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

回答

9

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

一旦窄元素和属性无辜的,陷阱是在属性内容 - javascript:伪网址(IE允许制表符在协议名称 - java	script:仍然有效),并触发JS CSS属性。

URL的解析可能比较棘手,这些是有效的:http://spoof.com:[email protected]//evil.com。 国际化域(IDN)可以用两种方式编写 - Unicode和punycode。

去与HTML净化器 - 它有这些大部分解决。如果您只是想修复损坏的HTML,请使用HTML Tidy(它以PHP扩展名的形式提供)。

5

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

另外要注意的有效的前瞻性:

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

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

感谢罗斯,这些都是应该被滤除的各种输入的优秀例子。但我正在寻找的答案将包括方法和解决方案。 – 2008-10-14 14:52:02

+0

第一个示例(它是对编码错误文章的引用:http://www.codinghorror.com/blog/archives/001171.html)并不真正相关,因为'漏洞'取决于该URL的性质,而是比这个特定的HTML代码片段的语法要复杂得多。 – 2008-10-14 15:26:38

+0

还有一些有用的规则可应用于第一个规则,例如“仅当src属性与正则表达式/^http:\/\/localsite.com\/uploaded_images\/[\w-]匹配时才允许标记” * \(PNG | JPG | GIF)。$ /我”。 – 2008-10-14 16:21:15

-1

W3C有在这里验证提供HTML一个大的开源软件包:

http://validator.w3.org/

你可以下载你自己的软件包,并可能实现无论他们在做什么。不幸的是,似乎很多DOM解析器似乎都愿意弯曲规则,以便像“疯狂”地分配HTML代码,所以最好让主人告诉你什么是错误的,而不是让它一个更实用的工具 - 有很多网站在那里不是完美,兼容的HTML,但我们仍然每天都在使用。

1

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