PHP中严格的HTML验证和过滤

Bar*_*tin 17 html php security xss validation

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

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

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

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

Kor*_*nel 9

我已经测试了我在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扩展).

  • 事实证明,它在2008年远非安全,这些漏洞在2011年被发现:http://secunia.com/advisories/43907/,2010:http://secunia.com/advisories/39613/教训:务必始终更新过滤器安装. (2认同)

Ros*_*oss 5

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

还要注意有效的外观:

<img src="http://www.mysite.com/logout" />
Run Code Online (Sandbox Code Playgroud)

<a href="javascript:alert('xss hole');">click</a>
Run Code Online (Sandbox Code Playgroud)