【问题标题】:HTTP Redirect (302) Doesn't Use Cookie in Following GET RequestHTTP 重定向 (302) 在 GET 请求之后不使用 Cookie
【发布时间】:2018-02-14 06:31:09
【问题描述】:

这是我研究了一段时间的问题。

我的重定向似乎不尊重 302 重定向中的 Set-Cookie 属性。

以下是我使用wireshark 获取的请求和响应标头。

HTTP/1.1 302 Moved Temporarily\r\n
Connection: close\r\n
Location: http://192.168.1.1:8888/home/\r\n
Set-Cookie: foo=test_data; Domain=192.168.1.1; Path=/\r\n
\r\n

GET /home/ HTTP/1.1\r\n
Host: 192.168.1.1:8888\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: en-US,en;q=0.8\r\n
DNT: 1\r\n
\r\n

我只是稍微清理了内容,但不应该修改任何重要的内容。关键是无论我使用什么浏览器,cookie 'foo' 都没有放在 302 之后的 GET 请求中。根据我的阅读,这不是预期的行为。我相信这一点不正确吗? 302 有什么我遗漏或做错了吗?

【问题讨论】:

  • 当您访问返回302的URL时,它是否托管在192.168.1.1:8888上?
  • 不,它可以是任何东西。重定向基本上形成为 MITM

标签: http redirect cookies get setcookie


【解决方案1】:

在问题中,Cookie 标头未出现在重定向的 HTTP 请求(GET http://192.168.1.1:8888/home)中。根本原因是:cookie foo=test_data 永远不存在。当它通过Set-Cookie响应头从服务器传递时,它会被浏览器拒绝,因为它的Domain不包括原始服务器。

根据MDN

属于不包括源服务器的域的 cookie应被用户代理拒绝。如果以下 cookie 是由托管在 originalcompany.com 上的服务器设置的,则将被拒绝。

设置 Cookie:qwerty=219ffwef9w0f;域=somecompany.co.uk;路径=/;过期=格林威治标准时间 2019 年 8 月 30 日星期三 00:00:00

更准确的描述可以查看RFC6265 section -4.1.2.3

这是有充分理由的。如果所有服务器都可以Set-Cookie为所有域,那么很容易清除其他网站的cookie,这对互联网来说将是一场灾难。

【讨论】:

  • 感谢您的回复。我已经多次阅读该页面,但从未注意到这个关键细节。即使这样,这也很容易理解。谢谢。
猜你喜欢
  • 2012-04-17
  • 2020-06-27
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多