javascript - 用户脚本可以从给定域中删除 cookie 吗?

标签 javascript firefox cookies greasemonkey userscripts

Greasemonkey 能否从给定域中删除 cookie?如果是,怎么办?

最佳答案

Greasemonkey 可以删除的内容有很大的限制。其他工具可能更适合您的需求,请参见下文。但是,如果满足所有这些条件:

  • 您要删除的 cookie 在当前页面的域中。
  • 它们不是 "Secure cookies" .
  • 循环遍历可能的路径,包括/、空白路径等。
  • 在页面加载后,javascript 不会设置任何 cookie。
  • 真正跟踪你的是一个“cookie”。许多网站使用各种其他技术,包括 LSO、本地存储等。

THEN,以下代码将删除它们:

//--- Loop through cookies and delete them.
var cookieList  = document.cookie.split (/;\s*/);

for (var J = cookieList.length - 1;   J >= 0;  --J) {
    var cookieName = cookieList[J].replace (/\s*(\w+)=.+$/, "$1");

    eraseCookie (cookieName);
}

eraseCookie() 是:
(请注意,此 eraseCookie 通过尝试所有可能的路径和最可能的子域来获取更多的 cookie。)

function eraseCookie (cookieName) {
    //--- ONE-TIME INITS:
    //--- Set possible domains. Omits some rare edge cases.?.
    var domain      = document.domain;
    var domain2     = document.domain.replace (/^www\./, "");
    var domain3     = document.domain.replace (/^(\w+\.)+?(\w+\.\w+)$/, "$2");;

    //--- Get possible paths for the current page:
    var pathNodes   = location.pathname.split ("/").map ( function (pathWord) {
        return '/' + pathWord;
    } );
    var cookPaths   = [""].concat (pathNodes.map ( function (pathNode) {
        if (this.pathStr) {
            this.pathStr += pathNode;
        }
        else {
            this.pathStr = "; path=";
            return (this.pathStr + pathNode);
        }
        return (this.pathStr);
    } ) );

    ( eraseCookie = function (cookieName) {
        //--- For each path, attempt to delete the cookie.
        cookPaths.forEach ( function (pathStr) {
            //--- To delete a cookie, set its expiration date to a past value.
            var diagStr     = cookieName + "=" + pathStr + "; expires=Thu, 01-Jan-1970 00:00:01 GMT;";
            document.cookie = diagStr;

            document.cookie = cookieName + "=" + pathStr + "; domain=" + domain  + "; expires=Thu, 01-Jan-1970 00:00:01 GMT;";
            document.cookie = cookieName + "=" + pathStr + "; domain=" + domain2 + "; expires=Thu, 01-Jan-1970 00:00:01 GMT;";
            document.cookie = cookieName + "=" + pathStr + "; domain=" + domain3 + "; expires=Thu, 01-Jan-1970 00:00:01 GMT;";
        } );
    } ) (cookieName);
}

可选函数,用于信息或调试:

function listCookies () {
    var cookieList  = document.cookie.split (/;\s*/);

    for (var J = 0, numCookies = cookieList.length;   J < numCookies;  ++J) {
        console.log ("Cookie ", J, ": ", cookieList[J]);
    }
}



您的 GM 脚本还可以使用 iFrame 技巧来删除第三方域上的 cookie,但一般而言,GM 并不是处理 cookie 的最佳方式。

不要被任何其他声明所迷惑,除非满足此答案顶部列出的所有条件,否则 Greasemonkey 和 javascript 根本无法删除 cookie。请注意,javascript 和 Greasemonkey 甚至无法查看页面上的所有 cookie。

Greasemonkey 不是最好的工具,尽管它可能适合特定情况。

这里有一些更强大的解决方案:

  1. 使用Selective Cookie Delete .它会保留您想要的 cookie,并删除其余的。按下一个非常方便的按钮或在 Firefox 关闭时自动执行此操作。支持白名单和黑名单。
  2. 使用BetterPrivacy对于更狡猾的 LSO。
  3. 运行 CCleaner至少每周一次,以消除广泛的跟踪和障碍。
  4. 对于功能强大的、自定义的、全自动的 cookie 删除,它没有 Greasemonkey 所具有的严重限制,并且比Selective Cookie Delete 运行得更频繁,您可以编写自己的浏览器扩展程序。

关于javascript - 用户脚本可以从给定域中删除 cookie 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2194473/

相关文章:

cookies - 你的 "remember me"cookie 的生命周期是多少?

jquery - 降临日历 - 使用 cookies 阻止用户两次打开 "calendar door"

python - 如何更改 python CookieJar 中一小部分 cookie 的值?

javascript - 光滑的 slider 自动播放不起作用

javascript - 在 ChartJS 中单击时如何获取条形图标签的值?

firefox - 在 Firefox 中查看服务器发送的事件

jquery 插件 'blockUI' 在 Firefox 中不会使屏幕变灰

javascript - 无法在 Node 应用程序中解析 json

javascript - 迭代数组对象

python - 消息: Unable to find a matching set of capabilities error using Selenium and GeckoDriver while loading on live server