PHP 中的严格 HTML 验证和过滤

2022-08-30 23:38:12

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

主要目的是过滤掉XSS和可以通过Web表单输入的类似内容。次要目的是限制非技术用户输入的HTML内容的破坏,例如通过具有HTML视图的所见即所得编辑器。

我正在考虑使用HTML Purifier,或者通过使用HTML DOM解析器来滚动我自己的过程,以完成HTML(dirty)->DOM(dirty)->filter->DOM(clean)->HTML(clean))之类的过程。

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


答案 1

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

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

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

HTML Purifier一起使用 - 它已经解决了其中的大部分问题。如果你只是想修复损坏的HTML,那么使用HTML Tidy(它可以作为PHP扩展名使用)。


答案 2

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

还要注意有效的外观:

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

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

推荐