保护用户自制HTML模板的安全性
我想让用户创建一些小模板,然后我在Django中用预设的内容来渲染这些模板。我认为Django的渲染是安全的(我之前问过一个关于这个的问题 在这里),但还是有跨站脚本攻击的风险,我想避免这种情况。这些模板的一个主要要求是,用户应该能控制页面的布局,而不仅仅是内容的意思。我看到几种解决方案:
- 允许用户使用HTML,但在最后一步手动过滤掉危险的标签(比如
<script>
和<a onclick='..'>
)。我对这个选项不是很热衷,因为我担心会漏掉一些标签。即使这样,用户仍然可以在<div>
上使用绝对定位,搞乱页面的其他部分。 - 使用一种标记语言,可以生成安全的HTML。从我看到的,大多数标记语言中,我可以去掉任何HTML,然后处理结果。这个方法的问题是,大多数标记语言在布局方面功能不强。就我所知,Markdown中没有办法居中元素,连ReST也没有。这个方法的好处是,有些标记语言文档齐全,用户可能已经知道怎么使用它们。
- 想出一些专有的标记语言。我看到的缺点几乎都和“专有”这个词有关。
所以,总结一下:有没有安全且简单的方法来“净化”HTML——防止跨站脚本攻击——或者有没有一种比较常见的标记语言,可以让用户对布局和样式有一定的控制。
资源:
4 个回答
“使用一种可以生成安全HTML的标记语言。”
这显然是唯一合理的做法。
“这个方法的问题在于,大多数标记语言在布局方面不够强大。”
这是错误的。
“在ReST中没有办法让元素居中。”
这也是错误的。
居中是一种样式——是CSS的一个特性,而不是标记的特性。
想要居中,可以给一段文本指定一个CSS类。这个
.. class::
指令就是用来做这个的。如果需要在一段
<span>
标记上指定一个内联类,你也可以定义自己的解释文本角色。
看到Pekka的回答,我赶紧在网上查了一下有没有Python版的HTML清理工具。结果我找到了这个:Python HTML Sanitizer。乍一看,这个工具看起来还不错。
有一个基于PHP的HTML净化器,我自己还没用过,但听说评价很好。他们承诺能做很多事情:
HTML净化器是一个符合标准的HTML过滤库,用PHP写的。它不仅能彻底清除所有恶意代码(也就是大家常说的XSS),还会确保你的文档符合标准,这可不是随便说说的,得对W3C的规范有深入了解。
虽然它不是基于Python的,但也许值得一试。更新一下:@Matchu找到了一款看起来也不错的Python替代品。
不过,你会遇到很多复杂的边缘情况,比如Flash嵌入。再加上,恶意使用position: absolute
的情况非常难以追踪(还有position: relative
,它能实现同样的效果,但也可能是完全合法的布局工具。)也许可以看看,比如EBay允许什么,不允许什么?如果有人对成千上万的例子有足够的经验,知道什么是危险的,什么不是,那就是他们了。
关于EBay的相关资源:
HTML和JavaScript,里面有例子
网站干扰,不过不太清楚哪些是被禁止的,哪些是被过滤的
根据我找到的信息,他们似乎不公开内部的HTML黑名单,但如果发现了禁止的代码,会输出错误信息。(这可能是他们明智的做法,但对这个问题来说就不太方便了。)