Удаление куки с 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 расширения.