9

我有一个登录屏幕,我强制使用 ssl,所以像这样: https ://www.foobar.com/login 然后在他们登录后,他们被移动到主页: https ://www.foobar.com/dashbaord

但是,我想在登录后将人们从 SSL 中移出(以节省 CPU),因此在检查他们实际上已登录https://www.foobar.com/dashbaord之后,我将他们移至 http:// www.foobar.com/dashbaord

好吧,这似乎总是会清除会话变量,因为当页面再次运行时,它会确认它们已登录(就像所有页面一样)并且会话似乎不存在,因此它将它们移动到登录屏幕。

奇数/发现:

  1. 项目清单
  2. 第二次登录总是有效,并且很高兴让我访问http://www.foobar.com/dashbaord
  3. 它在第一次登录时成功创建了一个 cookie
  4. 如果我登录两次,然后注销,然后再次登录,我不需要两次登录(我似乎已经将此追溯到 cookie 存在的事实)。如果我删除 cookie,我将返回两次登录。
  5. 第二次登录后,我可以从非 ssl 从 ssl 移动,并且会话仍然存在。
  6. 在第一次登录时,移动到非 ssl 站点会完全清除会话,手动移动回 ssl 站点仍然会迫使我再次登录。
  7. 第二次登录使用与第一次完全相同的机制,通过 ssl

我尝试了什么:

  1. 使用 Cake 的 security.level 和 session.checkagent 设置 - 没有
  2. 让蛋糕将会话存储在数据库中(而不是文件系统) - 没有
  3. 在 XP 机器上测试 FF、IE、Chrome。

所以我觉得这与正在创建但未被读取的 cookie 有关。

环境: 1. Debian 2. Apache 2 3. Mysql 4 4. PHP 5 5. CakePHP 6. 会话保存 PHP 默认为文件

4

7 回答 7

4

我想通了。Cake 在 SSL 连接下自动切换 session.cookie_secure ini 值,因此创建的 cookie 是安全 cookie,第二页无法识别。

解决方案,注释掉 /cake/lib/session.php 第 420 行 ish:

ini_set('session.cookie_secure', 1);

(只需搜索即可找到它,因为我确信 # 行会随着版本的发布而改变。)

于 2008-12-08T17:21:21.537 回答
4

虽然接受的答案满足了 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 显式链接 - 因为您需要发送包含身份验证信息的会话 cookie 和只有在链接被加密时,浏览器才会这样做。

于 2010-11-21T17:56:05.487 回答
3

首先,我是否正确理解第二次登录使用与第一次登录完全相同的机制(通过 HTTPS)?

除了登录期间创建的会话之外,不安全页面上的第一次点击是否会创建一个新会话?

检查是否在首次登录时未使用Secure标志设置 cookie(这意味着 cookie 应仅通过安全 (HTTPS) 连接发送)。

于 2008-11-21T12:58:20.187 回答
1

您可以在配置文件中指定您自己的会话处理设置(而不是编辑 CakePHP 库文件。)在配置文件中,您可以将 session.cookie_secure 设置为 0,这将优先于 /cake/lib/session 中的设置。 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

于 2010-02-05T18:35:21.353 回答
1

您可以在 http://book.cakephp.org/2.0/en/development/sessions.html上的 CakePHP 文档中阅读更多信息 ,当您的应用程序使用 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 :)

于 2013-08-15T15:55:18.713 回答
0

您的主页上是否有任何闪存向您的服务器发出后续请求?或者任何 Ajax 加载内容?

您是否检查过从服务器发送的标头?在 IE 中您可以使用 Fiddler 或在 Firefox 中使用 Live Headers 插件。检查设置的任何新 cookie 或具有不同值的 CAKEPHP cookie。

于 2008-11-21T14:10:55.033 回答
0

刚碰到这个问题,我评论了以下内容,效果很好:

<br />ini_set('session.name', Configure::read('Session.cookie'));
<br />
from session.php (/cake/lib/session.php, line 480~)
于 2010-01-28T09:25:52.220 回答