CakePHP Cookie/Session 问题
Posted
技术标签:
【中文标题】CakePHP Cookie/Session 问题【英文标题】:CakePHP Cookie/Session problems 【发布时间】:2011-12-19 15:52:55 【问题描述】:我的 Cakephp 应用程序有问题。这似乎只在 IE 中发生,并且仅在某些计算机上发生。它在发生它的计算机上是一致的。
问题一: 用户登录并在页面https://example.com/users/view 上单击退出。用户被重定向到http://example.com,并且似乎已注销,直到用户访问另一个 https 页面并且他们仍处于登录状态。他们可以根据需要多次单击注销,但他们始终在 https 上登录并且只会登录在http上。
问题二: 用户在https://example.com/users/signin 登录,他们被重定向到http://example.com,现在似乎已登录。用户转到https://example.com/admin/slides,但还不知道,但现在已注销,单击任何其他页面(或只是刷新他们的当前页面)将要求他们再次登录。
我不知道发生了什么。我已阅读并尝试了针对这两个类似问题描述的解决方案:Session not saving when moving from ssl to non-ssl 和 Cookie not renewing/overwriting in IE,但我仍然遇到同样的问题。
到目前为止,我注意到的唯一线索(我不知道这是否意味着什么)是当我在 HTTP 页面上同时调试 $_SESSION
和 $this->Session->read()
时,总是只有 $this->Session->read( ) 返回一个值。在 HTTPS 页面上,有些总是为两者返回相同的值,有些总是只返回 $this->Session->read() 的值。
例如,http://example.com 和 https://example.com/users 永远不会看到 $_SESSION,https://example.com/carts 总是看到 $_SESSION。我不确定,但我在想也许安全页面应该可以看到它,因为有些不可能可能有问题,但是当我检查代码时,我看不出有什么区别可以表明为什么一个可以看到而一个没有t.
另外,如果我在 AppController 的 beforeFilter 中添加$this->Session->destroy()
,那么所有页面甚至 HTTP 都可以看到 $_SESSION。我实际上并没有在我的应用程序中使用 $_SESSION,我只是认为这可能是错误的线索。
更新
我接受了 Gustav Bertram 的建议并查看了用户代理字符串。我将用户代理字符串与有问题的计算机上的 IE 与没有问题的计算机上的 IE 进行了比较。它们是相同的,除了有问题的用户代理字符串中有“谷歌浏览器框架”。我从那台计算机上卸载了 Google Chrome Frame,重新启动,再次尝试,问题似乎解决了。
如果这是真正的原因,那么简单的解决方案就是让用户卸载 Chrome 框架。但是我想知道是否有一种解决方法可以让他们安装 chrome 框架并且仍然可以工作。
【问题讨论】:
(我想你已经排除了常见的缓存嫌疑人。) IE 的哪个版本?修改页眉(缓存控制等 - 请参阅 support.microsoft.com/kb/234067)是否有任何影响? 会话内容是乱码还是什么?可能是安全选项.. 页面是否有Flash内容?您是否尝试过将会话安全性从 HIGH 更改为 LOW ? @satyrwilder 我不相信它的页面缓存,一切都是动态的。 @Dunhamzzz 我不确定你的意思是什么? 【参考方案1】:我的建议是您直接查看数据包,看看 cookie 发生了什么。
在您的客户端计算机上安装Wireshark,并连接到远程 Web 服务器。 (Wireshark 将忽略 localhost 流量。)
我怀疑您的 cookie 要么被损坏(我曾经有一些被 PHP 损坏的 cookie!),要么它们被卡住(这将是 IE 的错)。无论哪种方式,您都会获得有关问题所在的更多信息。
作为最后的手段,检查代码中的用户代理字符串是否有问题/不受支持的 IE 版本,并敦促人们升级。
【讨论】:
我奖励你赏金,因为你建议查看用户代理是导致我发现 chrome 框架问题的原因。不过,我仍然想找到一种方法让它与安装的 chrome 框架一起工作。 显然您可以在force IE with Google Chrome to use the Chrome rendering engine 中插入标签。如果这不给你带来快乐,那可能是错误报告时间。【参考方案2】:你确定你在关闭 php 后没有任何空格或换行符吗?> 标签?也许这是您检查的第一件事,但根据经验,我知道严重关闭的 php 标签确实会导致 php 会话处理的零星问题。
【讨论】:
【参考方案3】:试着把它放在你的 AppController 的 beforeFilter 中,看看它是否有任何作用。我感觉 cookie 设置没有按照您的需要进行配置。 See here 了解更多信息。
function beforeFilter()
$this->Cookie->domain = '.example.com';
$this->Cookie->secure = false;
【讨论】:
【参考方案4】:尝试将以下内容添加到您的 core.php 文件中:
Configure::write('Session.checkAgent', false);
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false));
这些参数应该强制 cookie 即使通过 Google Chrome Frame 仍然存在。这将设置 PHP 和 CakePHP 的设置以允许 cookie 通过 http 和 https 持久存在。
【讨论】:
我想我会提到这些是 CakePHP 2.0 参数。它们在 1.3 中可能略有不同,但应该允许您在登录时在 http 和 https 之间导航。 它看起来和 1.3 的语法一样,在 1.3 中工作没有错误。 :) 即使安装了镀铬框架,这似乎也能解决问题。你知道为什么 Cake 首先要检查代理吗?对不起,我已经把赏金给了,当我这样做的时候,它就要用完了。 这是一种安全措施。我认为默认情况下,它希望安全 cookie 仅在安全连接中有效。如果你去http,那么它就不再安全了。所以,在这里,我们基本上将其关闭。不用担心赏金。很高兴你成功了! @ScottHarwell 这些设置对应用程序安全性有影响吗? @DavidYell 在我看来,解决方案不会是安全问题。安全问题来自在 http 和 https 之间传递登录用户。应该将所有流量降级到 https 以保持适当的安全性,从而不需要这个问题/解决方案。以上是关于CakePHP Cookie/Session 问题的主要内容,如果未能解决你的问题,请参考以下文章
express-session 和 cookie-session 有啥区别?