网站的HTTP和HTTPS部分之间的Cookie不同步



我使用的是CakePHP(v1.3(和Auth组件。目前,所有cookie都不在HTTP和HTTPS之间的snyc中。

例如,用户可以通过HTTP登录而不通过HTTPS登录,或者更糟的是,用户a可以通过HTTP登陆,用户B可以通过HTTPS登陆。

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

我不知道发生了什么,也不知道如何修复。

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

这可能是由安全cookie引起的,只有在通过https访问页面时才会发送这些cookie。若页面是通过https访问的,CakePHP会自动设置session.cookie_secure。

要禁用此行为,请在cakelibscake_session.php 中将ini_set('session.cookie_secure', 1);更改为ini_set('session.cookie_secure', 0);

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

修改核心代码在大多数情况下都是一件坏事,在您的情况下,有可能做您需要的事情,但采用Cake方式。

在app/config/core.php中:修改会话。保存

//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的大部分好处都将消失,因为HTTPSHTTP使用相同的会话cookie,因此很容易窃取它,然后也很容易为HTTPS窃取会话。

我有一个网络应用程序的例子,它有一个通过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的部分只需要一个会话来获得更平滑的导航。

最新更新