【问题标题】:I need to get all the cookies from the browser我需要从浏览器中获取所有 cookie
【发布时间】:2010-09-20 03:23:19
【问题描述】:

我需要使用 JavaScript 获取存储在浏览器中的所有 cookies。如何做呢?

【问题讨论】:

  • nayagi,很遗憾,如果我们确实回答了您的问题,您将拥有不亚于 MALWARE 的软件。
  • @Jon Limjap - 这并不完全正确。有一些合法的场景可以枚举网络浏览器中的所有 cookie 而不会成为恶意软件。
  • 哇等一下。所有的饼干?从任何网站登录?那是恶意软件...
  • 我有一种情况(企业防火墙后面的 Web 应用程序),这样做会很方便且非常合法。然而,问题的存在是因为我们有太多的内部域(主要是通过虚拟主机),所以有人可能会争辩说解决方案是使用单点登录。
  • 如果你真的需要所有的cookies,你必须创建并安装一个浏览器扩展来做到这一点。用于登录的 Cookie 被认为是敏感的,浏览器会尽力保守这些秘密。

标签: javascript cookies


【解决方案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】:
  1. 您看不到其他网站的 cookie。
  2. 您看不到HttpOnly cookie。
  3. 您可以看到的所有 cookie 都在 document.cookie 属性中,该属性包含一个 分号 分隔的 name=value 对列表。

【讨论】:

    【解决方案3】:

    你不能。根据设计,出于安全目的,您只能访问您网站设置的 cookie。 StackOverflow 看不到 UserVoice 设置的 cookie,也看不到 Amazon 设置的 cookie。

    【讨论】:

    • facebook 是怎么做到的...?我总是看到 facebook 显示与我从 google 浏览的内容相关的广告!
    • 实际上,Facebook 在每个网站上都植入了自己的 cookie……使用它的“赞”按钮。我敢打赌 Google 在 +1 按钮甚至网站统计脚本上也会这样做。
    • 谢谢...,让我大开眼界。我认为与他们相关的任何类型的应用程序都可以,包括使用社交媒体帐户应用程序登录。
    • @SoursopTree - 不是 AdChoices 吗? Facebook 使用 AdChoices,这是一项 Google 服务,可根据您通过 Google 的搜索显示内容。 Stackoverflow 也使用 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

            【讨论】:

              猜你喜欢
              • 2015-03-07
              • 1970-01-01
              • 1970-01-01
              • 2013-05-01
              • 1970-01-01
              • 2017-12-24
              • 2021-04-07
              • 2020-06-14
              • 1970-01-01
              相关资源
              最近更新 更多