【问题标题】:Deleting cookies with JavaScript in Firefox extension在 Firefox 扩展中使用 JavaScript 删除 cookie
【发布时间】:2016-02-02 00:16:16
【问题描述】:

我已经搜索了很多关于使用 JavaScript 删除所有或特定 cookie 的内容。 有很多帖子说不可能 100%,或者你不能用HttpOnly flag 删除 cookie。那么问题来了,Cookies Manager+ Firefox 扩展如何使用 JavaScript 删除 cookie?或者Delete All Cookies From JavaScript Chrome 扩展程序如何让程序员通过向其扩展程序发送postMessage 来删除 cookie?

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

如何删除 Firefox 扩展程序中的 cookie?

【问题讨论】:

  • Firefox 和 Chrome 扩展在不同的 JavaScript 环境中运行,具有更高的权限。对网页内容施加的限制不一定适用。就是这样。
  • 你看过 Firefox 扩展的文档吗?
  • 鉴于您已经找到了完成您所关心的扩展的示例,您是否查看过它们用于完成任务的代码?这应该很清楚它是如何完成的。
  • 相关:How do I delete cross site cookies with firefox 22+ extension?。该问题包含用于删除 cookie 的功能齐全的代码。

标签: javascript cookies firefox-addon httponly cookie-httponly


【解决方案1】:

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

虽然我没有对其进行测试,但以下代码似乎可以满足您的需求:

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

【讨论】:

    【解决方案2】:

    就用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”权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多