我正在寻找对用户提交的HTML执行严格(白名单)验证/过滤的最佳做法。
主要目的是过滤掉可能通过网络表单输入的XSS和类似的恶意软件。次要目的是限制非技术用户输入的HTML内容的破坏,例如通过具有HTML视图的WYSIWYG编辑器。
我正在考虑使用HTML Purifier,或者通过使用HTML DOM解析器来完成HTML(脏) - > DOM(脏) - > filter-> DOM(清洁) - > HTML(干净)
您能用这些或更简单的策略描述成功吗?需要注意的任何陷阱?
答案 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的大型开源软件包:
您可以自己下载软件包,也可以实现他们正在做的任何事情。不幸的是,似乎很多DOM解析器似乎都愿意弯曲规则来分配“野外”的HTML代码,所以让主人告诉你什么是错的而不是留给它是个好主意。一个更实用的工具 - 有很多网站不是完美,符合标准的HTML,但我们仍然每天使用。