Удаление куки с JavaScript в расширении Firefox

Я много искал, чтобы удалить все или определенный cookie с помощью JavaScript. Есть много сообщений, которые говорят, что это невозможно на 100%, или вы не можете удалить куки с флагом HttpOnly. Тогда вопрос в том, как расширение Cookies Manager + Firefox может удалять куки с помощью JavaScript? Или как расширение Удалить все файлы cookie из JavaScript позволяет программистам удалять файлы cookie, отправляя postMessage к его расширению?

Я занимаюсь разработкой расширения для Firefox и мне нужно удалить некоторые файлы cookie с веб-сайта.

Как удалить куки в расширении Firefox?

2 ответа

Решение

Как отметил в комментарии Alexander O'Mara, JavaScript-расширения Chrome и Firefox работают в контексте, который имеет более высокие привилегии, чем 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;
};

Приведенный выше код немного изменен по сравнению с кодом, найденным в разделе Как удалить межсайтовые куки с расширением Firefox 22+?,

Однако приведенный выше код неэффективен, поскольку он перебирает все файлы 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;
};

Просто используйте API для просмотра данных. Я нашел его очень удобным и простым в использовании.

В вашем фоновом скрипте

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

Примечание. Я использовал разрешения «browsingData» и «storage» в файле mainfest.json расширения.

Другие вопросы по тегам