在 Firefox 扩展中使用 JavaScript 删除 cookie

Deleting cookies with JavaScript in Firefox extension

我搜索了很多关于使用 JavaScript 删除所有或特定 cookie 的信息。 有很多帖子说它不可能 100%,或者你不能删除带有 HttpOnly flag. Then the question is how the Cookies Manager+ Firefox extension can delete cookies with JavaScript? Or how the Delete All Cookies From JavaScript Chrome 扩展名的 cookie 让程序员通过发送 postMessage 到他的扩展名来删除 cookie?

我正在开发 Firefox 扩展,需要从网站上删除一些 cookie。

如何删除 Firefox 扩展中的 cookie?

正如 Alexander O'Mara 在评论中提到的,Chrome 和 Firefox JavaScript 扩展 运行 在比包含的 JavaScript 具有更高权限的上下文中在网页上。在更高的权限级别,他们被允许对 cookie 进行更改。您可能会感到困惑,因为您正在阅读讨论 JavaScript 的可能性的网页,即从网页 运行ning。

虽然我没有测试过,但下面的代码似乎可以满足您的需求:

var {Cc, Ci} = require("chrome");

function DeleteAllCookiesForDomain( domain ) {
    var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
    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, false);
                cookie_count++;
            }
        }
    }
    return cookie_count;
};

以上代码是从 How do I delete cross site cookies with Firefox 22+ extension?.

中找到的代码稍作修改的

但是,上面的代码效率低下,因为它遍历所有 cookie,而不仅仅是来自您有兴趣删除的域的 cookie。以下使用 nsICookieManager2 接口仅迭代您要删除的域的那些 cookie:

//For SDK
var {Cc, Ci} = require("chrome");
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
//*/
/*//For restartless/bootstrap/overlay
Components.utils.import("resource://gre/modules/Services.jsm");
var cookieManager = Services.cookies;
//*/

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;
};

就用browsingData API我发现它非常友好且易于使用

在你的后台脚本中

var removalOptions = {hostnames: ['example.com', 'www.example.com']};
var dataTypeSet = {cookies: true}; // , indexedDB: true, localStorage:true
browser.browsingData.remove(removalOptions , dataTypeSet);

注意:我在扩展mainfest.json文件中使用了“browsingData”和“storage”权限