从 ssl 移动到非 ssl 时会话未保存
Posted
技术标签:
【中文标题】从 ssl 移动到非 ssl 时会话未保存【英文标题】:Session not saving when moving from ssl to non-ssl 【发布时间】:2010-09-23 10:42:49 【问题描述】:我有一个强制使用 ssl 的登录屏幕,如下所示: https://www.foobar.com/login 然后在他们登录后,他们会被移动到主页: https://www.foobar.com/dashbaord
但是,我想在登录后将人们从 SSL 中移出(以节省 CPU),因此在检查他们实际上已登录 https://www.foobar.com/dashbaord 之后,我将它们移至 http://www.foobar.com/dashbaord
这似乎总是清除会话变量,因为当页面再次运行时,它确认它们已登录(就像所有页面一样)并且会话似乎不存在,因此它将它们移动到登录屏幕。
奇怪/发现:
-
列表项
第二次登录总是有效,并且很高兴让我到http://www.foobar.com/dashbaord
首次登录成功创建cookie
如果我登录两次,然后注销,然后再次登录,我不需要两次登录(我似乎已经将此追溯到 cookie 存在的事实)。如果我删除 cookie,我会返回两次登录。
第二次登录后,我可以从非 ssl 从 ssl 移动,会话仍然存在。
第一次登录时,移动到非 SSL 站点会完全清除会话,手动移动回 ssl 站点仍然会强制我再次登录。
第二次登录使用与第一次完全相同的机制,通过 ssl
我尝试了什么:
-
使用 Cake 的 security.level 和 session.checkagent 设置 - 什么都没有
让 cake 将会话存储在 db 中(而不是文件系统) - 什么都没有
在 XP 机器上在 FF、IE、Chrome 中进行测试。
所以我觉得这与正在创建但未被读取的 cookie 有关。
环境: 1. Debian 2. 阿帕奇 2 3.mysql 4 4. php 5 5.CakePHP 6. 会话被 PHP 默认保存为文件
【问题讨论】:
好的,我错了,这不会影响 IE。我没有正确清除 IE 中的缓存。 另见:***.com/questions/7969719/… 【参考方案1】:我想通了。 Cake 在 SSL 连接下自动切换 session.cookie_secure ini 值,因此创建的 cookie 是安全 cookie,第二页无法识别。
解决方法,注释掉 /cake/lib/session.php 第 420 行 ish:
ini_set('session.cookie_secure', 1);
(只需搜索即可找到它,因为我确信 # 行会随着版本的发布而改变。)
【讨论】:
如果您不想编辑核心文件,您可以做相反的事情,始终确保 cookie 安全。只需在 app_controller.php 中的 beforeFilter 中添加$this->Cookie->secure = true;
温馨提示。在 Drupal 领域工作多年,当我看到核心 hack 时,我会冒冷汗。
@Justin 现在是 2013 年,从 2011 年开始我还在流汗【参考方案2】:
虽然接受的答案满足了 OP 的愿望,即“一旦登录就将人们从 SSL 中移走”——这是非常不安全的,因为它将用户会话暴露给劫持(参见 Firesheep 以获得简单的利用)。
CakePHP 的默认行为(在用户通过 SSL 进行身份验证后要求所有页面都使用 SSL)和接受的答案(提供所有未加密的已验证页面并公开已验证的 cookie)之间的更好折衷是提供加密的页面当且仅当它们需要身份验证时才通过 SSL。
实现此目的的一种简单方法是维护两个会话 cookie - 一个提供安全的服务并保存身份验证信息,另一个提供不安全的服务。支持这种双会话方法的简单实现将使用 session_handler 来覆盖 session.name,如下所示:
if (env('HTTPS'))
ini_set('session.name', Configure::read('Session.cookie').'-SECURE');
else
ini_set('session.name', Configure::read('Session.cookie'));
使用这种方法要记住的一点是,从非 SSL 页面直接链接到需要身份验证的页面将需要您使用 https 显式链接 - 因为您需要发送包含身份验证信息,并且浏览器只有在链接被加密时才会这样做。
【讨论】:
首先,我正在浏览 Cake 文档,以了解更多关于在 SSL 身份验证后提供 SSL 的所有页面的默认行为,但找不到它,有人可以提供链接吗?其次,我无法让两个会话 cookie 方法为我工作。使用 beforeFilter 中的那段代码,我无法登录。如果可能,我想将我的非 SSL 页面提供给已登录的用户(即不注销),同时不暴露关键数据(再次,如果可能的话)。【参考方案3】:首先,我是否正确理解第二次登录使用与第一次登录完全相同的机制(通过 HTTPS)?
除了登录期间创建的会话之外,不安全页面上的第一次点击是否会创建一个新会话?
检查是否在首次登录时未使用Secure
标志设置 cookie(这意味着 cookie 只能通过安全 (HTTPS) 连接发送)。
【讨论】:
更新了我的问题以确认评论 1。评论 3,检查。 cookie 未设置为安全。评论 2:不确定,但它确实消除了 ssl 端确实存在的会话(片刻)。 你是对的!让我澄清一下:Cake 在 SSL 连接下自动切换 session.cookie_secure ini 值。解决方法,注释掉 /cake/lib/session.php 第 420 行 ish: > ini_set('session.cookie_secure', 1); 我不确定这里回答的礼仪是什么。该评论使我找到了解决方案,并确定了原因。但是,对于未来的用户,我在下面发布了完整的答案。公平地说,我将其标记为答案,但对他的答案投了反对票,因为它确实导致了解决方案。【参考方案4】:您可以在配置文件中指定自己的会话处理设置(而不是编辑 CakePHP 库文件。)在配置文件中,您可以将 session.cookie_secure 设置为 0,这将优先于 /cake/lib 中的设置/会话.php。这将允许会话 cookie 用于 SSL 和非 SSL 连接。
以下是有关该主题的博客条目: http://bakery.cakephp.org/articles/view/how-to-bend-cakephp-s-session-handling-to-your-needs
以及 Cookbook 中的一些文档: http://book.cakephp.org/view/173/Sessions
【讨论】:
【参考方案5】:您可以在 CakePHP 文档中阅读更多内容: http://book.cakephp.org/2.0/en/development/sessions.html 当您的应用程序在 SSL 协议上时,CakePHP 的默认设置 session.cookie_secure 为 true。如果您的应用程序同时使用 SSL 和非 SSL 协议,那么您可能会遇到会话丢失的问题。如果您需要访问 SSL 和非 SSL 域上的会话,则需要禁用此功能:
你打开文件 Config/core.php 并添加如下
Configure::write('Session', array(
'defaults' => 'php',
'ini' => array(
'session.cookie_secure' => false
)
));
现在您可以切换不会丢失会话的 http 和 https :)
【讨论】:
我遇到了同样的问题。我添加了 'session.cookie_secure' => false 并且问题解决了。只想知道使用 session.cookie_secure = false 是否足够安全? @elegant-user 我认为我们不应该将任何用户信息或重要信息存储到cookie中,只存储不需要安全的信息。【参考方案6】:您的主页上是否有任何 Flash 向您的服务器发出后续请求?还是任何 Ajax 内容加载?
您是否检查过从服务器发送的标头?在 IE 中您可以使用 Fiddler 或在 Firefox 中使用 Live Headers 插件。检查是否设置了任何新的 cookie 或具有不同值的 CAKEPHP cookie。
【讨论】:
我刚刚使用了实时标题,它在将用户移回登录屏幕之前设置了 cookie。在第二次登录时,没有设置额外的 cookie。奇数。【参考方案7】:刚碰到这个问题,我评论了以下,效果很好:
<br />ini_set('session.name', Configure::read('Session.cookie'));
<br />
from session.php (/cake/lib/session.php, line 480~)
【讨论】:
以上是关于从 ssl 移动到非 ssl 时会话未保存的主要内容,如果未能解决你的问题,请参考以下文章