【问题标题】:Making user-made HTML templates safe使用户制作的 HTML 模板安全
【发布时间】:2010-03-01 17:35:55
【问题描述】:

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

  • 允许用户使用 HTML,但在最后一步手动过滤掉危险标签(<script><a onclick='..'> 之类的东西。我对这个选项不太感兴趣,因为我担心我可能会忽略一些标签。即便如此,用户仍然可以在<divs> 上使用绝对定位来搞乱页面其余部分的一两件事。
  • 使用生成安全 HTML 的标记语言。据我所知,在大多数标记语言中,我可以剥离任何 html,然后处理结果。这样做的问题是大多数标记语言在布局方面不是很强大。据我所知,没有办法在 Markdown 中居中元素,即使在 ReST 中也是如此。这里的优点是一些标记语言有据可查,用户可能已经知道如何使用它们。
  • 想出一些专有标记。我在这里看到的缺点几乎都被专有这个词所暗示。

所以,总结一下:是否有一些安全且简单的方法来“净化”HTML——防止 xss—— 是否有一种相当普遍的标记语言可以控制布局和样式。

资源:

【问题讨论】:

    标签: python html security xss markup


    【解决方案1】:

    看到 Pekka 的回答后,我尝试快速在 Python 中搜索一个 HTML Purifier 等价物。这是我想出的:Python HTML Sanitizer。乍一看,我觉得还不错。

    【讨论】:

      【解决方案2】:

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

      HTML Purifier 是符合标准的 编写的 HTML 过滤器库 php。 HTML Purifier 不仅会删除所有恶意 经过彻底审计的代码(更广为人知的 XSS), 安全但允许的白名单, 它还将确保您的文件是 符合标准,只有通过 全面了解 W3C 规范。

      也许值得一试,即使它不是基于 Python 的。更新:@Matchu 找到了一个基于 Python 的替代方案,看起来也不错。

      不过,您会遇到很多非常困难的边缘情况,想想 Flash 嵌入。另外,position: absolute 的恶意使用极难追踪(position: relative 可以达到相同的效果,但也是一个完全合法的布局工具。)也许看看什么 - 例如 - eBay 允许,和不允许?如果有人有必要的经验,可以从数百万个例子中知道什么是危险的,什么不是,他们会的。

      eBay 上的相关资源:

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

      【讨论】:

      【解决方案3】:

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

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

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

      错误。

      “无法在 ReST 中居中元素。”

      错误。

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

      1. 想要居中是给一段文本分配一个 CSS 类。 .. class:: 指令执行此操作。

      2. 如果有必要在 <span> 标记上指定内联类,您还可以定义自己的解释文本角色。

      【讨论】:

      • 谢谢!我错过了 ReST 规范中的 ..class:: 指令。尽管标记语言是为格式化而不是为布局而设计的,但您可能会同意我的看法。当然,能够设置 CSS 类使一切成为可能。
      • 标记语言应该只提供语义和结构。 等标签没有语义意义,也不属于。展示(字体选择、颜色、布局等)是一个 CSS 问题。
      【解决方案4】:

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

      更大的挑战是防止模板系统出现无限循环和递归。这是对系统性能的明显威胁,但根据实施和部署设置,服务器可能永远不会超时。由于您可以使用有限数量的 Python 线程,重复调用行为不端的模板可能会很快导致您的网站崩溃。

      【讨论】:

      • 我将模板标签限制为变量包含 ({{var}})。呈现模板的上下文仅包含字符串。我认为这或多或少是安全的。我之前问过这个问题(见问题)。你看到异常了吗?
      猜你喜欢
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多