【问题标题】:Safely using remote HTML安全地使用远程 HTML
【发布时间】:2012-11-07 06:31:00
【问题描述】:

我被要求通过一个名为 parseHTML 的函数传递一些 html,这些 html 从我的服务器发送到我的 Firefox 插件,这是由 Mozilla 插件审阅者提供的。有问题的方法记录在this XUL school tutorial中。

然而,在我的内容脚本中,typeof parseHTML == "undefined"。我相信这是因为我的插件是使用插件 SDK 而不是 XUL 构建的。

用SDK构建的插件不能访问这个方法是正确的吗? SDK中是否有等效方法?

【问题讨论】:

  • 当然这个函数没有定义——它的源代码在你链接到的教程中引用。你真正需要的是nsIParserUtils,这是你的附加代码(不是内容脚本)可以访问的。那么,该 HTML 代码是否会通过您的附加代码?请注意,虽然 XUL 学校教程很旧 - 您链接到的特定文档非常新并且非常最新。
  • 不,它是从内容脚本中的 JS 模板构建的。听起来我必须在运行时在内容脚本中编译一个模板,向附加代码发出一条消息,传递 html 字符串。清理 html 字符串,然后将其传递回内容脚本进行渲染?听起来很有趣:-)
  • 或者也许改变模板机制(不知道你在那里使用什么),以便它不处理原始 HTML 代码?如果您可以使用.textContent 填写动态数据,则无需任何清理即可安全。
  • 我已经在使用Underscore's escape function 对所有内容进行消毒。显然这还不够。
  • 使用该功能的缺点是您很容易忘记在某些地方进行转义,这会导致安全漏洞。也许这就是审稿人的意思——最好使用更强大的方法。话又说回来,审阅者总是有可能只是错过了代码的那个方面。

标签: firefox firefox-addon escaping firefox-addon-sdk html-sanitizing


【解决方案1】:

当然,这个函数是未定义的——它不是一些全局定义的帮助器,而是你必须在代码中定义的东西(如代码示例所示)。它使用您需要访问的nsIParserUtils interface。在基于 SDK 的扩展中,您将为此使用 chrome authority

var {Cc, Ci} = require("chrome");
var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
var sanitized = parser.sanitize(html, parser.SanitizerAllowStyle);

如果您在内容脚本中,那么您当然不能使用它 - 您需要将 HTML 代码发送到插件,在那里对其进行清理并将其发送回内容脚本。虽然这是一个选项,但您可能需要考虑其他可能性,例如首先不使用innerHTML(如果您只需要在元素上设置一些文本,那么textContent 是一个安全的选择)。

旁注:虽然 XUL 教程相当陈旧,但这个特定页面一年前才被导入 MDN - 并且根据历史记录从那以后定期更新。所以它是最新的,只是不明确地用于附加 SDK(实际上就像大多数 MDN 文章一样)。

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多