代码之家  ›  专栏  ›  技术社区  ›  noio

使用户制作的HTML模板安全

  •  3
  • noio  · 技术社区  · 14 年前

    我希望允许用户创建小模板,然后在django中使用预定义的上下文呈现这些模板。我假设django渲染是安全的(我问了一个关于这个的问题 before ,但是仍然存在跨站点脚本编写的风险,我想防止这种情况。这些模板的主要要求之一是用户应该对页面的布局有一些控制,而不仅仅是语义。我看到了一些解决方案:

    • 允许用户使用HTML,但在最后一步中手动筛选出危险的标记(如 <script> <a onclick='..'> . 我对这个选择不太感兴趣,因为恐怕我会忽略一些标签。即使这样,用户仍然可以在 <divs> 在这一页的其余部分弄乱一两件事。
    • 使用A 标记语言 生成安全的HTML。据我所见,在大多数标记语言中,我可以去掉任何html,然后处理结果。这方面的问题是,大多数标记语言在布局方面不是很强大。据我所见,没有办法在降价时将元素居中,即使在休息时也是如此。这里的专业是一些标记语言有很好的文档记录,用户可能已经知道如何使用它们。
    • 想出一些专有的标记。我在这里看到的缺点几乎都是这个词暗示的 专有的

    因此,总结一下:有没有一些安全和简单的方法来“净化”防止xss的html?- 是否有一种相当普遍的标记语言可以对布局和样式进行某种控制。

    资源:

    4 回复  |  直到 14 年前
        1
  •  1
  •   Pekka    14 年前

    有基于php的 HTML purifier ,我自己还没用过,但听说了很多好消息。他们承诺很多:

    HTML净化器符合标准 编写的HTML筛选器库 PHP。HTML净化器不仅会删除所有恶意 代码(通常称为xss)经过彻底审核, 安全而宽容的白名单, 它还将确保您的文档 符合标准,只有 全面了解W3C规范。

    尽管它不是基于python的,但也许值得一试。更新:@matchu找到了一个基于python的替代方案,看起来也不错。

    你会有很多非常困难的边缘案例,不过,想想flash嵌入。另外,恶意使用 position: absolute 很难找到 position: relative 这可能会达到同样的效果,但也是一个完全合法的布局工具。)或许可以看看ebay允许什么,不允许什么?如果有人有必要的经验从数百万的例子中知道什么是危险的,什么不是危险的,他们就会知道。

    易趣上的相关资源:

    从我发现的情况来看,他们似乎没有发布内部HTML黑名单,但如果发现了禁止代码,就会输出一条错误消息。(这可能是他们的明智之举,但就这个问题而言,这是不幸的。)

        2
  •  3
  •   Matchu    14 年前

    看到pekka的答案,我试着在python中快速搜索一个html净化器。我想到的是: Python HTML Sanitizer . 乍一看,我觉得很不错。

        3
  •  1
  •   S.Lott    14 年前

    “使用生成安全HTML的标记语言。”

    显然,这是唯一明智的做法。

    “这方面的问题是,大多数标记语言在布局方面不是很强大。”

    错误的。

    “无法将元素置于静止状态的中心。”

    错误的。

    居中是一种样式——一种CSS特性——而不是标记特性。

    1. 想要居中是为了给一段文本分配一个css类。这个 .. class:: 指令就是这么做的。

    2. 如果需要在 <span> 标记。

        4
  •  0
  •   mikerobi    14 年前

    您忽略了服务器端的安全问题。您需要非常小心,用户不能使用模板导入或包含机制来访问他们没有权限访问的文件。

    更大的挑战是防止模板系统无限循环和递归。这对系统性能是一个明显的威胁,但是根据实现和部署设置,服务器可能永远不会超时。使用有限数量的python线程,重复调用一个行为不正常的模板可能会很快让您的站点崩溃。