【问题标题】:Can I disable a cookie from being sent automatically with server requests?我可以禁止 cookie 随服务器请求自动发送吗?
【发布时间】:2013-08-10 19:59:51
【问题描述】:

我对网站开发还很陌生。我正在一个用户使用用户名/密码登录的网站上工作,并从服务器获取 sessionID 作为响应。这个 sessionID 会随着每个请求发送回服务器(并返回一个新的)。

如果用户在多个选项卡或窗口中打开该网站,我希望它能够正常工作。即一旦在一个选项卡上登录,在另一个选项卡中打开一个仅限会员的 URL 无需登录。(并且,在一个选项卡中注销会从所有选项卡中注销。)如果不将最新的 sessionID 存储在曲奇饼。这样,最新的 sessionID 可以在所有选项卡之间“共享”。

但是我开始阅读 cookie 和一些 security threats。我不知道每个请求都会发送 cookie。我永远不需要将我的 cookie 发送到服务器。 sessionID 被添加到 xhr 请求的标头中——不作为 cookie 读取。所以我想知道是否有办法禁用发送这个cookie。我这样做的唯一目的是允许同一浏览器中的多个选项卡/窗口共享同一会话。

我正在阅读path parameter for cookies。显然这可以用来限制cookie何时发送到服务器?如果我将路径设置为永远不会使用的东西怎么办?这会阻止 cookie 自动发送出去吗?我只想从 JavaScript 访问它。

一位同事在此应用程序的服务器端设置了很多保护措施,我不会在此赘述。所以这个问题是关于我可以并且应该采取哪些客户端预防措施,特别是对于 cookie,以获得最佳安全性。如果有更好的方法可以让会员专享网站在同时打开多个标签的情况下正常工作,我会全力以赴。

【问题讨论】:

    标签: security cookies session-cookies


    【解决方案1】:

    sessionID 已存储在 cookie 中,无需管理它。因为 HTTP 协议是无状态的,所以保持状态的唯一方法是通过 cookie。当您设置会话值时会发生什么,服务器将查找与该 cookie id(会话 ID)关联的项目的字典。

    无状态的意思是在请求之间HTTP不知道你是否还活着或已经关闭了你的浏览器。因此,对于每个请求,浏览器都会将所有 cookie 值附加到域上的请求中。当他们访问您的站点时,SessionId 会自动存储在 cookie 中。然后,服务器使用该值来查找您在用户会话中设置的任何内容。

    根据您使用的编程语言和/或服务器,会话的处理方式可能有所不同,但这通常是从程序员那里抽象出来的。

    现在关于会话,有许多不同的因素使它们不安全。例如,如果攻击者能够获得您的会话 cookie 值,他们可以重放该 cookie 并接管您的会话。因此,会话并不是一种非常安全的存储用户信息的方式。相反,大多数人所做的是使用用户详细信息创建一个加密的 cookie 值,cookie 可以是“会话 cookie”,这意味着一旦用户关闭浏览器窗口,cookie 就会从浏览器中丢弃。加密的 cookie 包含用户信息和角色信息以及一些标识符(通常是客户端的 ip 地址),以验证提交请求的用户是否与发出 cookie 的用户相同。在大多数编程语言中,也有一些工具可以帮助将其抽象出来(例如 ASP.NET 成员提供程序模型)。

    首先在维基百科上查看有关 HTTP 协议和 HTTP cookie 的一些详细信息

    并查看 ASP.NET 上的会员提供程序模型,它是帮助保护您的站点的一个非常好的工具。

    http://msdn.microsoft.com/en-us/library/sx3h274z(v=vs.100).aspx

    【讨论】:

    • 感谢您提供信息,但我想问的具体问题是“允许用户使用多个选项卡或窗口访问网站但无需登录的标准方法是什么?再次为他打开的每个新标签/窗口?”我为此使用了 cookie。这是正常的方式吗?
    • @VernJensen 是的,正如通常所说的那样,就是使用某种加密的 cookie,其中包含用户成员信息。如果您使用的是 ASP.NET 之类的东西,您可以使用为您做这件事的会员提供者模型。
    【解决方案2】:

    阻止浏览器发送cookies似乎从一开始就破坏了使用cookies的目的。

    如果您不希望每次请求都发送 sessionID,为什么要设置 cookie?更好的解决方案是使用您从服务器发送到浏览器的自定义响应标头 - 这将在您的控制之下,并且不会随所有浏览器请求自动发送。无论如何,您都在使用请求标头发送您的 sessionID,因此您可以使用自定义标头从服务器接收它们,并从每个 XHR 将其读入您的 JavaScript。

    【讨论】:

    • 使用 cookie 的目的是允许在同一浏览器中的多个选项卡或窗口之间共享网站的仅限会员区域。 (因此您不必每次打开新标签时都重新登录。)如果不使用 cookie,正确的方法是什么?这就是我要问的问题。
    • > “我永远不需要将我的 cookie 发送到服务器。”不太正确,因为您需要它来支持多选项卡。无论如何,您提到的本地存储选项可能是要走的路。祝你好运!
    【解决方案3】:

    我刚刚发现,在 HTML 5 中有 local storage,它存储键/值对很像 cookie,但不会随每个服务器请求一起发送。由于除了 IE 7 和更早版本之外的所有浏览器都支持它,因此我将切换到它以启用在可用时在选项卡之间共享数据,并在 IE 7 和更早版本上使用 cookie。

    【讨论】:

    • localStorage 确实是一个很好的解决方案,但重要的是要注意 localStorage 不是在 http 和 https 之间共享的,而 cookie 可以。因此,如果您有混合页面将无法正常工作。
    • localStorage 在 Safari 的隐私浏览模式下也不可用。你必须回退到cookies。
    • @AlexanderBurakevych localstorage 在隐私浏览模式下工作正常,但当然存储会在会话结束时被清除,而不是被持久化。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2021-02-21
    • 2014-03-04
    • 2017-09-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多