0

在 AMO 编辑最近的一次审查中,我的 Thunderbird 插件版本被拒绝,因为它“从包含未经处理的数据的字符串创建 HTML”——这“是一个重大的安全风险”。

我想我明白为什么了。现在,我的问题是如何解决这个问题。

这个线程给了我一些线索,但这不是我所需要的。

我的插件需要将剪贴板的内容粘贴为超链接,使用剪贴板内容作为链接文本,并在其周围插入 html,如下所示:`" + clipboardtext + ""。

现在,如果我将剪贴板内容作为 HTML 插入,我需要先“清理”它。这是我想出的。现在,我还没有写正则表达式部分,因为我认为这不是最好的方法,尽管我认为它会起作用:

function makeSafeHTML(whathtml){
    var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils);
    var sanitizedHTML = parser.sanitize(whathtml, 01);

    //now remove the extratags added by the sanitization method, perhaps via regex
    //"<html><head></head><body>"
    //"</body></html>"

    return sanitizedHTML;
}

我的意图是使用生成的“净化”字符串来执行此操作 - 这会将字符串粘贴为href超链接的值:

var html_editor = editor.QueryInterface(Components.interfaces.nsIHTMLEditor);
html_editor.insertHTML("<a href='"+whathref+"'>"+whattext+"</a>");

所以我正在寻找一种更好的方法来将经过净化的 HTML 转换为一个简单的字符串变量。你们中有人会这样做吗?

4

1 回答 1

1

似乎您只是想将剪贴板内容作为纯文本插入 HTML 代码中 - 然后您不需要任何复杂的转义方法,确保所有“危险”字符都被 HTML 实体替换就足够了:

var sanitizedText = text.replace(/&/g, "&amp;").replace(/</g, "&lt;")
                        .replace(/>/g, "&gt;").replace(/"/g, "&quot;");

从您的问题中不清楚您对生成的 HTML 代码做了什么。如果您通过类似的方式将其添加到 DOM 文档中,innerHTML那么您可以做得更好 - 首先添加 HTML 代码并操作文档中的文本,然后:

document.getElementById("text-container").textContent = text;

用于在文档Node.textContent中设置文本始终是安全的,无需进行转义。

于 2013-05-28T09:22:21.367 回答