如何使用Firefox 22+扩展删除跨站点cookie?

时间:2013-07-29 17:34:36

标签: firefox cookies firefox-addon firefox-addon-sdk cross-site

我正在尝试向我的Firefox扩展添加一个功能,以便在单击站点A上的按钮时触发从站点B删除cookie的事件。站点A和B不共享域,但站点B在注入站点A的iframe中运行。我需要在Firefox内容脚本中单击事件来触发内容脚本或Firefox扩展主体中的事件以删除所有来自网站B的cookie。

我将点击侦听器分配给按钮并触发。我已经在Google Chrome中使用扩展程序实现了同样的效果。我收到有关使用组件的错误,但我找不到使用而不是组件的解决方案。它只需要在Firefox 22+上运行。我正在使用addon-sdk-1.14来开发扩展。

ContentScript.js

function DeleteCookies() {
    var payload="Delete";
    self.port.emit("Delete", payload);
}

Main.js

var {Cc, Ci} = require("chrome");
pageMod.PageMod({
    include: "*",
    contentScriptFile: [ self.data.url("jquery-1.9.1.js")
                        ,self.data.url("script.js")],
    onAttach: function(worker) {
                  worker.port.on('Delete',function (){ DeleteCookies();});
              }
});

function DeleteCookies() {
    var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
    var domain= "siteB.com";
    var iter = cookieManager.enumerator;
    var cookie_count = 0;
    while (iter.hasMoreElements()) {
        var cookie = iter.getNext();
        if (cookie instanceof Ci.nsICookie) {
            if (domain.indexOf(cookie.host.toUpperCase()) != -1) {
                cookieManager.remove(cookie.host, cookie.name, cookie.path, cookie.blocked);
                cookie_count++;
            }
        }
    }
};

2 个答案:

答案 0 :(得分:1)

您无法从内容脚本访问XPCOM。使用port mechanism进行内容脚本和main.js之间的通信,并从后者中删除cookie。

答案 1 :(得分:1)

似乎正确执行任务的代码已编辑到问题中,而不是作为答案发布。不幸的是,似乎存在一个错误,它会遍历所有cookie,而不仅仅是您希望删除的域中的那些cookie。对于问题Deleting cookies with JavaScript in Firefox extension,我修改了这个问题中的代码以提高效率,并修复了错误。鉴于我已经在编写代码,我在这里发布它,以便其他人不需要通过确定代码被编辑到问题中并找到代码的问题。

如果没有为cookieManager.remove()定义cookie.blocked属性,则会将blocked传递给nsICookie。应该传递的内容是false,假设没有意图阻止来自该主机的cookie。实际上,undefined目前正在通过。

只使用nsICookieManager2界面来迭代来自相关主机的cookie,而不是所有cookie。特别是getCookiesFromHost()方法。

更新的代码是:

ContentScript.js

function DeleteCookies() {
    var payload="Delete";
    self.port.emit("Delete", payload);
}

Main.js

var {Cc, Ci} = require("chrome");
pageMod.PageMod({
    include: "*",
    contentScriptFile: [ self.data.url("jquery-1.9.1.js")
                        ,self.data.url("script.js")],
    onAttach: function(worker) {
                  worker.port.on('Delete',function (){ DeleteCookies();});
              }
});

var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);

function DeleteCookies() {
    DeleteAllCookiesForDomain("siteB.com");
};

function DeleteAllCookiesForDomain( domain ) {
    var iter = cookieManager.getCookiesFromHost(domain);
    var cookie_count = 0;
    while (iter.hasMoreElements()) {
        var cookie = iter.getNext();
        if (cookie instanceof Ci.nsICookie) {
            cookieManager.remove(cookie.host, cookie.name, cookie.path, false);
            cookie_count++;
        }
    }
    return cookie_count;
};