【问题标题】:Cookie not renewing/overwriting in IECookie 未在 IE 中更新/覆盖
【发布时间】:2011-02-04 08:14:00
【问题描述】:

我对 IE 中的 cookie 有一个奇怪的怪癖。当用户登录网站时,我正在生成一个新的会话 ID,因此需要覆盖 cookie。流程基本上是:

  1. 客户端转到https://secure.example.com/users/login页面,自动接收会话ID
  2. 客户端将登录凭据发布到同一地址
  3. 客户端收到以下 set-cookie 标头以及 302 重定向到 https://secure.example.com/users/mypage

    CAKEPHP=已删除;过期=星期日,2009 年 4 月 5 日 04:50:35 GMT;路径=/
    CAKEPHP=98hnIO23...; expires=2010 年 4 月 12 日星期一 04:50:36 GMT;路径=/;安全

  4. 客户端应该访问https://secure.example.com/users/mypage,提供新的会话ID。

这适用于所有浏览器,除了 IE(在 7 和 8 中测试)。 IE 保留旧的、未经身份验证的会话 ID,并被重定向回登录页面。它适用于我的本地测试环境(使用https://localhost:8443/... 的自签名证书),但不适用于实时服务器。

我正在使用 CakePHP,只需发出 $this->Session->renew(),它会生成上述 cookie 标头。

任何想法如何让 IE 接受新的 cookie?


这是完整的标题:

HTTP/1.0 302 Moved Temporarily
Date: Thu, 08 Apr 2010 02:54:30 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Set-Cookie: CAKEPHP=deleted; expires=Wed, 08-Apr-2009 02:54:30 GMT; path=/
Set-Cookie: CAKEPHP=d55c...; expires=Thu, 15 Apr 2010 02:54:31 GMT; path=/; secure
Last-Modified: Thu, 08 Apr 2010 02:54:30 GMT
Location: https://secure.example.com/users/mypage
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=utf-8

我想我找到了问题所在: IE 正在发送 两个 相同名称的 cookie。这是对服务器的下一个请求:

GET /users/mypage HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */ *
Referer: https://secure.example.com/users/login
Accept-Language: en-gb
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)
Accept-Encoding: gzip, deflate
Host: secure.example.com
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: CAKEPHP=19c6...; CAKEPHP=d55c...

请注意,它发送了两个 cookie,一个是登录后收到的,一个是旧的。它在主页example.com收到旧的,设置为path=/。它还将请求发送到secure.example.com。它不会被上述标头替换,而是将其添加为附加 cookie。我怎样才能阻止它这样做?

【问题讨论】:

  • 也许尝试在创建新cookie之前专门删除旧cookie?
  • @David 我认为这就是我正在做的事情。在同一个标​​题中我还能怎么做?

标签: internet-explorer cakephp cookies http-headers


【解决方案1】:

一个常见的问题是第二次设置 cookie 的尝试缺少正确的 P3P 标头,因此触摸 cookie 的尝试被忽略。

如果您发布整个流程的标题会很有帮助(例如,使用 Fiddler 捕获和查看)

【讨论】:

  • 在玩弄了Fiddler之后,我想我找到了问题的根源,请再看一遍问题。
  • 当你有两个同名 cookie 时,典型的问题是你要么用两个不同的 PATH 属性设置同一个 cookie,要么用两个不同的 DOMAIN 属性设置同一个 cookie。后者通常发生在用户以 //example.com 访问您的站点,然后又以 //www.example.com 重新访问时发生。如果您的网站不小心总是在不设置 cookie 的情况下重定向到 www.example.com,那么您最终会得到两个。由于 cookie 域继承的性质,两者都会在您访问 www.example.com 时发送。最简单的检查方法?访问 //example.com 并检查!
  • 当我更仔细地阅读您的问题时,听起来您已经知道这是问题所在。要修复它,请将 DOMAIN=example.com 属性添加到所有 SET-COOKIE 响应标头。
【解决方案2】:

确保为您的基本域发出 cookie。

这很可能是问题所在,因为这种行为在不同的浏览器中肯定会有所不同。

我没有在cakephp中做过,但是this should work

【讨论】:

  • 是的,这就是问题所在。我通过链接方法添加了ini_set('session.cookie_domain', '.example.com')。谢谢!
【解决方案3】:

您可能会遇到两个问题。首先,给@freddy-rios 中的链接发布一个镜头。如果不这样做,那么您可能会遇到 IE “重定向 cookie 错误”。

IE 并不总是在重定向期间接受 cookie 修改。如果您在登录表单上分配了一个会话 ID,并且不更改它,那么重定向应该可以正常工作。如果您在重定向时更改 cookie,那么您可能会以旧会话结束......浏览器只会将旧 cookie 提交到新 URL(可以说,它应该做什么......重定向原始请求)。

有几种方法可以解决这个问题。到目前为止,最丑陋的是使用 Javascript 或 META 标记重定向。只要您通过这些 cookie 传递非 300,浏览器几乎总是会接受它们。

如果您使用的是$this->Session->renew(),只需将其删除即可解决您的所有问题……尤其是当它在后台调用session_regenerate_id() 时。

我建议删除重定向并查看它是否仍然存在问题。如果是,那么你可以忽略我所说的一切。 :)

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多