如何使用`nsIParserUtils.parseFragment()`for Firefox addon

时间:2016-12-09 22:23:54

标签: security firefox firefox-addon firefox-addon-sdk innerhtml

我们的Firefox插件会在后端(main.js)向Google发出查询,然后通过xpath提取一些内容。为此,我们使用innerHTML为xpath解析创建document实例。但是当我们将这个插件提交给Mozilla时,我们被拒绝了,因为:

  

此附加组件通过分配innerHTML,jQuery.html或类似方法,从包含可能未经过数据处理的数据的HTML字符串创建DOM节点。除了效率低下,这是一个主要的安全风险。有关详细信息,请参阅https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion

根据提供的链接,我们尝试将innerHTML替换为nsIParserUtils.parseFragment()。但是,示例代码:

let { Cc, Ci } = require("chrome");
function parseHTML(doc, html, allowStyle, baseURI, isXML) {
  let PARSER_UTILS = "@mozilla.org/parserutils;1";
  ...

Cc, Ci实用程序只能在main.js上使用,而该函数需要documentdoc)作为参数。 但我们找不到有关在document 内创建main.js的任何示例,我们无法使用document.implementation.createHTMLDocument("");。因为main.js是一个后台脚本,它没有引用全局内置document

我google了很多,但仍然找不到任何解决方案。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您可能希望使用nsIDOMParser,这与窗口全局中可访问的标准DOMParser相同,只是您可以在没有窗口对象的特权上下文中使用它。

虽然如果您不提供自己的<html><body>元素,它会为您提供整个文档。如果你绝对需要一个片段,你可以使用html5模板元素通过domparser提取片段:

let partialHTML = "foo <b>baz</b> bar"
let frag = parser.parseFromString(`<template>${partialHTML}</template>`, 'text/html').querySelector("template").content