【问题标题】:Cookies out of sync between HTTP and HTTPS parts of site站点的 HTTP 和 HTTPS 部分之间的 Cookie 不同步
【发布时间】:2011-12-17 08:22:52
【问题描述】:

我正在使用 CakePHP (v 1.3) 和 Auth 组件。现在所有的 cookie 都不在 HTTP 和 HTTPS 之间。

例如,用户可以在 HTTP 上登录但未在 HTTPS 上登录,或者更糟糕的是,用户 A 可以在 HTTP 上登录而用户 B 可以在 HTTPS 上登录。

其他事物也会发生这种情况(例如购物车中的商品)

我不知道发生了什么或如何解决它。

我需要怎么做才能让它们在 HTTP 和 HTTPS 上拥有相同的 cookie?

【问题讨论】:

  • 这很可能是设计使然,通常由 HTTP 或 HTTPS 发送的请求可能会呈现不同的站点内容。

标签: cakephp cookies https


【解决方案1】:

这可能是由安全 cookie 引起的,它们仅在通过 https 访问页面时发送。如果通过 https 访问页面,CakePHP 会自动设置 session.cookie_secure。

要禁用此行为,请将ini_set('session.cookie_secure', 1); 内的ini_set('session.cookie_secure', 0); 更改为cake\libs\cake_session.php

我建议在应用程序端处理它,并且只允许通过 https 登录(和所有成员页面)。

【讨论】:

  • 我已经在这样做了,对于我 beforeRender() 中的所有用户页面,如果页面是 http,它会重定向到 https。所以我不知道该怎么办。
  • 尝试按照此处接受的答案中的建议进行操作:stackoverflow.com/questions/308659/…
  • 感谢您指点我那里。我正在尝试确认它可以解决问题。 :)
【解决方案2】:

修改核心代码在大多数情况下是一件坏事,在你的情况下,有可能做你需要做的事情,但是蛋糕的方式。

在app/config/core.php中:修改Session.save

//Configure::write('Session.save', 'php');

//this will look for a 'mysession.php' file in app/config
Configure::write('Session.save', 'mysession'); 

在 app/config 中:创建一个 mysession.php 文件,其中包含您想要用于会话的参数

ini_set('session.use_trans_sid', 0);
ini_set('session.name', Configure::read('Session.cookie'));
ini_set('session.cookie_lifetime', $this->cookieLifeTime); 
ini_set('session.cookie_path', $this->path);

//overwrite Cake setting already set by CakeSession 
ini_set('session.cookie_secure', 0); 

另外请注意,如果您将 cookie 设置为不安全,则使用 HTTPS 的大部分好处都将消失,因为由于 HTTPS HTTP 使用相同的会话 cookie,这变得很容易窃取它,然后窃取 HTTPS 会话。

我有一个 webapp 的案例,其中管理部分通过 HTTPS 和公共部分通过 HTTP 也需要会话。我设法通过指定两个不同的 cookie 名称来分隔这两个部分:

在 app_controller.php 中:

if(env('HTTPS')
{
    Configure::write('Session.save', Configure::read('Session.save') . '_https');
}

在 app/config 中,使用

创建另一个名为 *mysession_https.php* 的文件
ini_set('session.use_trans_sid', 0);
ini_set('session.name', Configure::read('Session.cookie') . 'S');

//cookie destroyed when users close their browser 
ini_set('session.cookie_lifetime', 0); 

ini_set('session.cookie_path', $this->path);

ini_set('session.cookie_secure', 1); 

这会创建两个不同的会话,一个通过 HTTP,一个通过 HTTPS,但在我的情况下这很好,因为所有敏感或私有数据都通过 HTTPS,而通过 HTTP 的部分只需要一个会话才能获得更流畅的导航。

【讨论】:

  • 他们能否在 http 上看到他们的 https cookie?例如,我不想通过 http 向他们显示他们的个人资料信息,但是如果他们已登录,那么我不想在 http 上显示“登录”链接,而是显示“我的帐户”链接。
  • 不。永远不会将安全 cookie 发送到 http url 以防止其不安全的传输。要执行您想要的操作,您可以在成功登录后将用户重定向到一个特殊的 http 页面,该页面仅对设置 http 会话变量以指示用户已登录有用。并在以下情况下使用相同的想法删除此变量用户注销。但我不确定浏览器是否会抱怨如果它得到一个从 https 重定向到 http 的位置标头。
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2015-08-03
  • 2017-06-29
相关资源
最近更新 更多