HTTP cookie端口是否特定?

gue*_*rda 326 security cookies http

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

Rem*_*eau 305

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

  1. 介绍

...

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

并且:

8.5.弱机密性

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

  • `/etc/hosts` 可用于为 `127.0.0.1` 创建比 `localhost` 更多的 cookie 域 (3认同)

Tgr*_*Tgr 128

根据RFC2965 3.3.1(浏览器可能会或可能不会遵循),除非通过标头的port参数明确指定端口,否则Set-Cookiecookie可能会也可能不会发送到任何端口.

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

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

  • [RFC 6265](http://tools.ietf.org/html/rfc6265)取代了RFC 2965,它消除了`Set-Cookie`标题中的`Port`参数(因为在实践中几乎没有人真正使用它),并明确表示同一主机上的cookie不再能被端口区分. (64认同)
  • 如果域中有一个端口,IE 9甚至不会在后续请求中发回cookie (4认同)
  • 如果域中有域名,则Chrome甚至不会设置cookie. (4认同)
  • 是否有任何浏览器仍在考虑其Cookie中的端口SOP? (2认同)

Pat*_*Pat 65

这是一个非常古老的问题,但我想我会添加一个我用过的解决方法.

我的笔记本电脑上运行了两个服务(一个在端口3000上,另一个在4000上).当我在(http://localhost:3000http://localhost:4000)之间跳转时,Chrome会传入相同的cookie,每个服务都无法理解cookie并生成新的cookie.

我发现,如果我访问http://localhost:3000http://127.0.0.1:4000,问题走了,因为Chrome浏览器保持一个cookie本地主机,一个用于127.0.0.1.

同样,在这一点上没有人可以关心,但这对我的情况很容易和有帮助.

  • 此外,您可以使用127.0.0.1,127.0.0.2,127.0.0.3等...它们都表示localhost. (42认同)
  • 是的,因为 cookie 与主机/域名相关联,所以 localhost 上的 cookie 不能与 127.0.0.1 共享,反之亦然。但是同一主机/域上的 cookie,无论端口如何,都是可共享的。 (3认同)
  • 他们当然会这样做.我(可能还有数百万其他开发人员)一直使用localhost进行测试.除非添加的端口有所不同:http:// localhost:8080 / (3认同)
  • 我无法赞成这一点,因为它没有回答这个问题,但这是一个很好的提示,谢谢! (2认同)
  • 如果您愿意编辑主机文件(Unix上的/ etc/hosts),则可以为localhost创建任意多个有意义的名称. (2认同)
  • @DavidBalažic 不,“本地主机”表示 127.0.0.1。127.0.0.2 通常没有名称。这些地址是不同的单播地址,并且被 TCP 协议视为任何不同的单播地址,但它们都是本地的。 (2认同)
  • @SilasS.Brown 请不要说“对于本地主机”。“localhost”是与特定 IP 地址关联的名称。说“本地主机”。 (2认同)

ZZ *_*der 19

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

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

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

  • 它不再是灰色区域了.[RFC 6265](http://tools.ietf.org/html/rfc6265),这是当前的cookie标准,通过简单地消除使用不同端口在同一主机上分离cookie的能力消除了对它的任何混淆. (8认同)

小智 17

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

  • mysession8080用于在端口8080上运行的服务器
  • mysession8000用于在端口8000上运行的服务器

您的代码可以访问Web服务器配置以找出服务器使用的端口,并相应地命名cookie.

请记住,您的应用程序将同时收到两个cookie,您需要请求与您的端口对应的cookie.

cookie名称中不需要确切的端口号,但这更方便.

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


Jeb*_*Jeb 9

在IE 8中,cookie(仅针对localhost验证)在端口之间共享.在FF 10中,它们不是.

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


And*_*ndi 6

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

我用这些命令运行它们:

./manage.py runserver 8000
./manage.py runserver 8001
Run Code Online (Sandbox Code Playgroud)

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

我将其添加到我的/etc/hosts中

127.0.0.1    app1
127.0.0.1    app2
Run Code Online (Sandbox Code Playgroud)

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

./manage.py runserver app1:8000
./manage.py runserver app2:8001
Run Code Online (Sandbox Code Playgroud)

问题解决了 :)

  • 您可能可以使用“127.0.0.1:8000”作为一个,“localhost:8000”作为第二个,并且可能使用“::1:8000”(也许“[::1]:8080”)作为第三个,而无需使用触摸主机文件。 (4认同)
  • 你可以把它放在一行中: ```::1 app1 app2 app3 app4 app5 appN``` (2认同)