如何记住我与会话超时不同

Cam*_*ron 6 php cookies session cakephp

我在CakePHP中构建了一个应用程序,允许用户登录并做一些事情,它让用户登录大约24小时,我认为默认情况下.这是由会话/ cookie处理的,因为cookie也会被创建...

1.)那么记得我带给聚会的是什么?正如所做的那样,创建一个设置超时并保持用户登录的另一个cookie ...但是默认情况下,每个应用程序都存在此功能,会话权限正确吗?但我已经看到很多网站都在这样做,但我不明白为什么会议开箱即用:/

2.)即使用户继续使用网站,会议如何到期?例如,如果我将其设置为1分钟但每30秒刷新一次它仍将过期...但我保持网站活动在它到期之前所以它怎么可能仍然过期?这很烦人,因为我有一个1小时的应用程序到期,但即使客户端使用该网站,它会在1小时后过期,无论活动如何.

如果有人可以回答这两个问题,那就太好了.

更新:我已经为此创建了一个赏金,希望能让CakePHP专家帮助解决这个问题.问题是会话在用户交互超时后失效.我想要做的是说我有一个持续5分钟的会话,并且用户每30秒进行一次回发,然后该会话将在5分钟后仍然存在.目前情况并非如此......

Configure::write('Session', array(
        'start' => true,
        'defaults' => 'php',
        'timeout' => 1,
        'cookieTimeout' => 1,
        'autoRegenerate' => true
    ));
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 8

  1. 它带来的是,如果用户关闭其浏览器并重新启动它,它仍将自动登录.会话cookie不是这种情况,因为一旦浏览器关闭就会删除这样的cookie.

  2. 也许你每隔30秒去的页面没有开始会话.在这种情况下,不使用会话机制,并且会话的到期日期不会重置为now + 1 minute.或者刷新只能访问浏览器缓存,而不是服务器.


dr *_*ter 8

好吧,让我们看看我是否可以获得一些赏金(战利品?),同时还测试我的解释技巧:)

所以让我们从#1开始吧.

那么记得我带给派对的是什么?

这里要区分的重要一点是"会话cookie"和"记住我的cookie"之间的区别.

由于HTTP是无状态协议,因此会话cookie用于将多个请求绑定到单个用户.没有它,对您的网络服务器的每个请求都与其他所有请求完全无关.你能想象没有会话编写应用程序吗?每个请求都是空的,没有登录,没有会话变量.每个请求都是未知用户!这基本上意味着没有网络应用!

现在,重要的是要意识到你绝对不希望你的会话持续24小时!在我的书中,这是一个非常大的禁忌.会话越短,它就越安全(至少在理论上).为什么?因为一个会话可以被劫持!你的会话越长,被劫持的可能性就越大.

例如,想象一下银行应用程序.此外,假设您的用户正在公共PC上访问它(我们的用户不是最聪明的用户).所以他正在管理他的帐户或其他......他的电话响了.作为一个白痴,他接听电话并离开,没有退出.您希望会话在5分钟,15分钟或24小时内到期吗?不了解你,但对于像网上银行这样重要的事情,我希望那次会议尽快消失.

继续"记住我"的部分.

因此会话cookie在一个会话中"连接"多个请求,"记住我"cookie的作用是什么?简单来说:它将多个会话绑定到单个用户.

您希望您的网站使用起来轻松愉快,登录几乎不会令人愉快.在做你真正想做的事情之前,你每次都要做的事情只是一个烦人的事情.记得我的饼干消除了这种烦恼.

您登录一次,选中此框,现在您始终登录该PC.这就是为什么你应该永远不会使用"记住我"功能,而共享的电脑上,因为旁边的人都会有自己的身份.合法地.这就是为什么记住我的cookie也存在安全风险,它们可能像会话cookie一样被劫持.

最后,会话cookie和记住我的cookie之间存在一个重要的区别:到期.会话cookie通常在您关闭浏览器时(或在您明确指定的时间之后)到期,而记住我的cookie通常会持续更长时间.

即使用户继续使用网站,会议如何到期?

为简单起见,他们没有.您必须更改cake(或您的应用程序)处理会话的方式.答案必须在代码中的某处.你在这里没有得到满意答案的原因是因为我们看不到你的代码.您只需调试并跟踪您的cookie会发生什么.JB Nizet给了你一些建议.

我知道可能在某些服务器上造成问题的一件事是蛋糕的安全级别.尝试降低它/Config/core.php:

Configure::write('Security.level', 'medium'); // or 'low'
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,那么答案肯定在你的代码中.我希望这个答案会让你朝着正确的方向前进!