我需要从浏览器中获取所有 cookie
Posted
技术标签:
【中文标题】我需要从浏览器中获取所有 cookie【英文标题】:I need to get all the cookies from the browser 【发布时间】:2010-09-20 03:23:19 【问题描述】:我需要使用 javascript 获取存储在浏览器中的所有 cookies。如何做呢?
【问题讨论】:
nayagi,很遗憾,如果我们确实回答了您的问题,您将拥有不亚于 MALWARE 的软件。 @Jon Limjap - 这并不完全正确。有一些合法的场景可以枚举网络浏览器中的所有 cookie 而不会成为恶意软件。 哇等一下。所有的饼干?从任何网站登录?那是恶意软件... 我有一种情况(企业防火墙后面的 Web 应用程序),这样做会很方便且非常合法。然而,问题的存在是因为我们有太多的内部域(主要是通过虚拟主机),所以有人可能会争辩说解决方案是使用单点登录。 如果你真的需要所有的cookies,你必须创建并安装一个浏览器扩展来做到这一点。用于登录的 Cookie 被认为是敏感的,浏览器会尽力保守这些秘密。 【参考方案1】:您只能访问特定网站的 cookie。使用 document.cookie
,您将获得由分号分隔的转义键=值对列表。
secret=do%20not%20tell%you;last_visit=1225445171794
为了简化访问,您必须解析字符串并取消转义所有条目:
var getCookies = function()
var pairs = document.cookie.split(";");
var cookies = ;
for (var i=0; i<pairs.length; i++)
var pair = pairs[i].split("=");
cookies[(pair[0]+'').trim()] = unescape(pair.slice(1).join('='));
return cookies;
所以你以后可能会写:
var myCookies = getCookies();
alert(myCookies.secret); // "do not tell you"
【讨论】:
这不会捕获分号 ("; ") 之后的空格,因此键在前面有一个空格...使用 /; ?/ 何时拆分以删除它们? 检查 this sn-p 以解析document.cookies
(来自 O'Reilly 的书)。
应该真正将 .trim() 添加到 pair[0] 以确保没有前导空格。【参考方案2】:
-
您看不到其他网站的 cookie。
您看不到
HttpOnly
cookie。
您可以看到的所有 cookie 都在 document.cookie
属性中,该属性包含一个 分号 分隔的 name=value
对列表。
【讨论】:
【参考方案3】:你不能。根据设计,出于安全目的,您只能访问您网站设置的 cookie。 *** 看不到 UserVoice 设置的 cookie,也看不到 Amazon 设置的 cookie。
【讨论】:
facebook 是怎么做到的...?我总是看到 facebook 显示与我从 google 浏览的内容相关的广告! 实际上,Facebook 在每个网站上都植入了自己的 cookie……使用它的“赞”按钮。我敢打赌 Google 在 +1 按钮甚至网站统计脚本上也会这样做。 谢谢...,让我大开眼界。我认为与他们相关的任何类型的应用程序都可以,包括使用社交媒体帐户应用程序登录。 @SoursopTree - 不是 AdChoices 吗? Facebook 使用 AdChoices,这是一项 Google 服务,可根据您通过 Google 的搜索显示内容。 *** 也使用 AdChoices。我可能对确切的细节有点偏离 - 但我猜这就是你所想的。 @KeepMove 我们将此术语称为cookie-syncing【参考方案4】:要检索在浏览器中打开的当前文档的所有 cookie,请再次使用 document.cookie
属性。
【讨论】:
【参考方案5】:现代方法。
let c = document.cookie.split(";").reduce( (ac, cv, i) => Object.assign(ac, [cv.split('=')[0]]: cv.split('=')[1]), );
console.log(c);
;)
【讨论】:
它似乎在每个键之前生成一个空格。示例:“cookie_name”而不是“cookie_name” 解决添加trim:return document.cookie.split(";").reduce((ac, cv, i) => Object.assign(ac, [cv.split('=' )[0].trim()]: cv.split('=')[1]), );【参考方案6】:由于标题没有指定它必须是程序化的,我假设这是一个真正的调试/隐私管理问题,解决方案取决于浏览器,并且需要一个内置详细 cookie 管理收费和/或调试模块或插件/扩展。我将列出一个,并请其他人在他们详细了解的浏览器上写下来,并请提供准确的版本。
铬,铁构建(SRWare Iron 4.0.280)
扳手(工具)菜单:选项/引擎盖下/[显示 cookie 和网站权限] 对于相关域/站点,在搜索框中输入后缀(如 .foo.tv)。警告:当您有一个节点(站点或 cookie)单击突出显示时,仅使用 [删除] 来杀死特定的子树。使用 [Remove All] 仍然会删除搜索选择的所有站点的 cookie,并浪费您的调试会话。
【讨论】:
【参考方案7】:将trim()添加到object的key中,并将其命名为str,这样就更清楚我们在这里处理的是string了。
export const getAllCookies = () => document.cookie.split(';').reduce((ac, str) => Object.assign(ac, [str.split('=')[0].trim()]: str.split('=')[1]), );
【讨论】:
【参考方案8】:如果你开发browser extensions你可以试试browser.cookies.getAll()
【讨论】:
【参考方案9】:你问的是可能的;但这仅适用于特定浏览器。您必须开发一个浏览器扩展应用程序来实现这一点。您可以阅读有关 chrome api 的更多信息以更好地理解。 https://developer.chrome.com/extensions/cookies
【讨论】:
以上是关于我需要从浏览器中获取所有 cookie的主要内容,如果未能解决你的问题,请参考以下文章
服务器获取浏览器发送请求中的cookies,选取自己需要的cookie
如何使用C#中的Selenium Webdriver使用Chrome浏览器的Cookie?