HTTP cookies 端口特定吗?

问题描述 投票:0回答:8

我在一台机器上运行两个 HTTP 服务。我只是想知道他们是否共享 cookie 或者浏览器是否区分两个服务器套接字。

security http cookies
8个回答
455
投票

不,cookie 不提供端口隔离。

当前的 cookie 规范是 RFC 6265,它取代了 RFC 2109RFC 2965(这两个 RFC 现在都标记为“历史”),并正式化了 cookie 实际使用的语法。它明确指出:

  1. 简介

...

由于历史原因,cookie 存在许多安全和隐私缺陷。例如,服务器可以指示给定的 cookie 用于“安全”连接,但安全属性在存在主动网络攻击者的情况下不提供完整性。 同样,给定主机的 cookie 会在该主机上的所有端口之间共享,即使 Web 浏览器通常使用的“同源策略”会隔离通过不同端口检索的内容。

还有:

8.5。保密性弱

Cookie 不提供端口隔离。如果在一个端口上运行的服务可以读取 cookie,则在同一服务器的另一端口上运行的服务也可以读取该 cookie。如果某个端口上的服务可写入 cookie,则同一服务器的另一端口上运行的服务也可写入该 cookie。因此,服务器不应该在同一主机的不同端口上运行相互不信任的服务,也不应该使用 cookie 来存储安全敏感信息。


153
投票

根据 RFC2965 3.3.1(浏览器可能会或可能不会遵循),除非通过

port
标头的
Set-Cookie
参数显式指定端口,否则 cookie 可能会也可能不会发送到任何端口.

Google 的 浏览器安全手册 说: 默认情况下,cookie 范围仅限于当前主机名上的所有 URL - 并且不绑定到端口或协议信息。 以及后面的一些行 没有办法将 cookie 限制为仅单个 DNS 名称 [...] 同样,无法将它们限制为特定端口。(另外,请记住,IE 根本不会将端口号纳入其同源策略。)

因此,在这里依赖任何明确定义的行为似乎并不安全。


117
投票
这是一个非常老的问题,但我想我会添加一个我使用过的解决方法。

我的笔记本电脑上运行两项服务(一项在端口 3000 上,另一项在端口 4000 上)。 当我在 (

http://localhost:3000

http://localhost:4000
) 之间跳转时,Chrome 会传入同一个 cookie,每个服务都不会理解该 cookie 并生成一个新的 cookie。 

我发现,如果我访问

http://localhost:3000

http://127.0.0.1:4000
,问题就消失了,因为 Chrome 为 localhost 保留了一个 cookie,为 127.0.0.1 保留了一个 cookie。

再说一遍,此时可能没有人关心这一点,但这对我的情况很简单且有帮助。


23
投票
这是 cookie SOP(同源策略)中的一个很大的灰色区域。

理论上,您可以在域中指定端口号,并且cookie不会被共享。实际上,这不适用于多种浏览器,并且您会遇到其他问题。因此,只有当您的网站不面向公众并且您可以控制要使用的浏览器时,这才可行。

更好的方法是为同一 IP 获取 2 个域名,而不依赖于 cookie 的端口号。


20
投票
解决该问题的另一种方法是使会话 cookie 的名称与端口相关。例如:

  • mysession8080 用于在端口 8080 上运行的服务器
  • mysession8000 用于在端口 8000 上运行的服务器
您的代码可以访问网络服务器配置以找出您的服务器使用哪个端口,并相应地命名 cookie。

请记住,您的应用程序将收到这两个 cookie,并且您需要请求与您的端口相对应的 cookie。

Cookie 名称中不需要包含确切的端口号,但这更方便。

一般来说,cookie 名称可以对特定于您使用的服务器实例的任何其他参数进行编码,因此可以通过正确的上下文对其进行解码。


10
投票
在 IE 8 中,cookie(仅针对本地主机进行验证)在端口之间共享。在《FF 10》中,情况并非如此。

我发布了这个答案,以便读者至少有一个具体的选项来测试每个场景。


6
投票
我在同一台机器上运行(并尝试调试)两个不同的 Django 应用程序时遇到了类似的问题。

我用这些命令运行它们:

./manage.py runserver 8000 ./manage.py runserver 8001

当我登录第一个,然后在第二个时,我总是在第一个中注销,反之亦然。

我将其添加到我的

/etc/hosts

127.0.0.1 app1 127.0.0.1 app2

然后我使用以下命令启动了这两个应用程序:

./manage.py runserver app1:8000 ./manage.py runserver app2:8001

问题解决了:)


-1
投票
这是可选的。

可以指定端口,因此 cookie 可以是特定于端口的。没有必要,网络服务器/应用程序必须处理这个问题。

来源:

德语维基百科文章RFC2109,第 4.3.1 章

© www.soinside.com 2019 - 2024. All rights reserved.