用户可以删除给定域中的cookie吗?

Tho*_*ing 8 javascript cookies firefox greasemonkey userscripts

Greasemonkey可以删除给定域中的cookie吗?如果是这样,怎么样?

Bro*_*ams 12

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

  • 您要删除的Cookie位于当前页面的域中.
  • 它们不是"安全cookie".
  • 循环遍历可能的路径,包括/空白路径等.
  • 页面加载后,javascript没有设置cookie.
  • 跟踪你的东西真的是一个"cookie".许多网站使用各种其他技术,包括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);
}
Run Code Online (Sandbox Code Playgroud)

其中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);
}
Run Code Online (Sandbox Code Playgroud)

可选功能,用于信息或调试:

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

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



您的GM脚本也可以使用iFrame技巧删除第三方域上的Cookie,但GM通常不是处理Cookie的最佳方式.

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

Greasemonkey不是最好的工具,尽管它可能适用于特定情况.

以下是一些更强大的解决方案:

  1. 使用选择性Cookie删除.它可以保留您想要的cookie并删除其余的cookie.它通过一个非常方便的按钮或Firefox关闭时自动执行此操作.支持白名单和黑名单.
  2. 使用BetterPrivacy用于偷偷摸摸的LSO.
  3. 每周至少运行CCleaner一次,以驱除广泛的跟踪和残骸.
  4. 对于强大的,自定义的,全自动的cookie删除,它没有Greasemonkey的严格限制,并且比Selective Cookie Delete更频繁地运行,您可以编写自己的浏览器扩展.

  • 非常感谢!最后,一个有效的cookie删除脚本! (2认同)