用户脚本可以删除给定域中的 cookie 吗?
-
25-09-2019 - |
题
Greasemonkey 可以删除给定域中的 cookie 吗?如果是这样,怎么办?
解决方案
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);
}
在哪里 eraseCookie()
是:
(请注意,这 删除Cookie 通过尝试所有可能的路径和最可能的子域来获取更多的 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 并不是最好的工具,尽管它可能足以满足某些情况。
以下是一些更强大的解决方案:
- 使用 选择性 Cookie 删除. 。它会保留您想要的 cookie 并删除其余的。只需按下一个非常方便的按钮即可执行此操作,或者在 Firefox 关闭时自动执行此操作。支持白名单和黑名单。
- 使用 更好的隐私 对于更狡猾的 LSO。
- 跑步 CC清理器 每周至少一次,以消除广泛的跟踪和欺骗行为。
- 用于强大的、自定义的、全自动的 cookie 删除,它没有 Greasemonkey 所具有的严格限制,并且运行频率比 选择性 Cookie 删除, ,您可以编写自己的浏览器扩展。
其他提示
您应该能够删除Cookie为当前打开的网站。看一看在饼干Zapper的脚本,这可能会做你想要什么,如果不是源将可能指向您在正确的方向。
不隶属于 StackOverflow