清理不受信任的HTML5

Bri*_*ian 5 html html5 html-sanitizing

我希望能够接受来自不受信任的用户的HTML并对其进行清理,以便我可以安全地将其包含在我网站的页面中.我的意思是标记不应该被剥离或逃过一劫,但应该通过基本保持不变,除非它包含危险的标记,如传递<script><iframe>危险属性,如onload,或危险的CSS属性,如背景的URL.(显然一些较旧的IE会在CSS中执行javascript URL吗?)

从iframe中包含的不同域提供内容不是一个好选择,因为没有办法事先告诉iframe有多高,所以对于某些页面来说总是看起来很难看.

我查看了HTML Purifier,但看起来它还不支持HTML5.我也研究了Google Caja,但我正在寻找一种不使用脚本的解决方案.

有谁知道一个可以实现这个目标的图书馆?PHP是首选,但乞丐不能选择.

Qui*_*ker 6

黑名单方法会让您面临升级压力.因此,每次浏览器开始支持新标准时,您必须将消毒工具绘制到同一级别.这种变化比你想象的更频繁.

白名单(由具有明确定义的例外情况的strip_tags实现)可以缩小用户的选项,但会将您置于保存站点上.

在我自己的网站上,我有政策在页面上为非常受信任的用户(例如管理员)应用黑名单,并在所有其他页面上应用白名单.这让我无法在黑名单上投入太多精力.通过更成熟的角色和权限概念,您甚至可以对黑名单和白名单进行细化.


更新:我猜你是这样的:

我认为strip_tags在标签级别上列入白名单,但确实接受了属性级别的所有内容.有趣的是,HTMLpurifier似乎在属性级别上进行了白名单.谢谢,这是一个很好的学习.

  • `strip_tags`无法保护免受危险属性的影响.只要允许标记,它就不会触及属性. (2认同)

Kev*_*sse 2

您也许可以做以下事情:

preg_replace('/<\s*iframe\s+[^>]*>.*<\s*\/\s*iframe\s+[^>]*>/i', '', $html);
preg_replace('/<\s*script\s+[^>]*>.*<\s*\/\s*script\s+[^>]*>/i', '', $html);
preg_replace('/\s+onload\s+=\s+"[^"]+"/i', '', $html);
Run Code Online (Sandbox Code Playgroud)

...但话又说回来:你有了正则表达式,现在你有两个问题 - 这可能会删除超出想要的内容,也可能会留下超出想要的内容。

但由于 HTML Purifier 可能是最现代、最适合(且开源)的项目,您仍然应该使用该项目,并且如果您确实需要它们,也许可以进行调整。

您还可以查看以下其中一项:

尽管您还必须确保您自己的页面布局不会因未关闭标签而在包含结果时受到影响。