代码之家  ›  专栏  ›  技术社区  ›  Thomas Eding

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

  •  7
  • Thomas Eding  · 技术社区  · 15 年前

    Greasemonkey可以从给定域删除cookie吗?如果是,怎么做?

    2 回复  |  直到 7 年前
        1
  •  13
  •   Brock Adams    10 年前

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

    • 要删除的Cookie位于当前页面的域中。
    • 它们不是 "Secure cookies" .
    • 您可以循环通过可能的路径,包括 / ,空白路径等。
    • 跟踪你的东西其实是一块“饼干”。许多网站使用各种其他技术,包括LSO、本地存储等。

    然后 ,以下代码将删除它们:

    //--- 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()
    (请注意 橡皮擦饼干 通过尝试所有可能的路径和最可能的子域,获取更多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的最佳方式。

    看见 一页上所有的cookies。

    以下是一些功能强大得多的解决方案:

    1. Selective Cookie Delete . 它保留您想要的cookies,并删除其余的cookies。它只需按下一个非常方便的按钮,或者在Firefox关闭时自动完成。白名单和黑名单都受支持。
    2. 使用 BetterPrivacy 给偷偷摸摸的LSO。
    3. CCleaner 每周至少一次,以消除广泛的跟踪和积垢。
    4. 选择性Cookie删除 ,您可以编写自己的浏览器扩展。
        2
  •  0
  •   slashnick Epirocks    13 年前