我正在寻找对用户提交的HTML执行严格(白名单)验证/过滤的最佳实践.
主要目的是过滤掉可能通过网络表单输入的XSS和类似的恶意软件.次要目的是限制非技术用户输入的HTML内容的破坏,例如通过具有HTML视图的WYSIWYG编辑器.
我正在考虑使用HTML Purifier,或者通过使用HTML DOM解析器来完成HTML(脏) - > DOM(脏) - >过滤器 - > DOM(干净) - > HTML(干净)等过程.
您能用这些或任何更简单的策略描述成功吗?有什么陷阱需要注意?
我已经测试了我在HTML Purifier上所知道的所有漏洞并且它做得非常好.它不仅可以过滤HTML,还可以过滤CSS和URL.
一旦你将元素和属性缩小到无辜的元素和属性,陷阱就是属性内容 - javascript:
伪URL(IE允许协议名称中的制表符 - java script:
仍然有效)和触发JS的CSS属性.
解析URL可能很棘手,例如这些是有效的:http://spoof.com:xxx@evil.com
或//evil.com
.国际化域(IDN)可以用两种方式编写 - Unicode和punycode.
使用HTML Purifier - 它已经完成了大部分工作.如果您只想修复损坏的HTML,请使用HTML Tidy(它可用作PHP扩展).
用户提交的HTML并不总是有效,或者确实完整.浏览器将解释各种无效的HTML,您应该确保能够捕获它.
还要注意有效的外观:
和
click