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


How does remember me differ from session timeout

我在 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
    ));

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

因此,让我们从#1开始。

那么,一个记得我的人会给聚会带来什么呢?

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

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

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

例如,假设一个银行应用程序。另外,假设您的用户正在公共PC上访问它(我们的用户不是最聪明的)。所以他正在管理他的帐户或其他什么。他的手机响了。作为一个白痴,他接听电话离开,没有注销。您希望会话在 5 分钟、15 分钟还是 24 小时后过期?不了解您,但对于像网上银行这样重要的事情,我希望该会话尽快结束。

转到"记住我"部分。

那么会话 cookie 在单个会话中"连接"多个请求,"记住我"cookie 有什么作用?简单来说:它将多个会话绑定到单个用户。

您希望您的网站易于使用且令人愉快,而登录几乎从来都不是愉快的。这只是一件烦人的事情,你每次都必须做,然后才能做你真正想做的事情。记住我的饼干消除了这种烦恼。

登录一次,选中该框,现在您始终登录到该 PC。这就是为什么你不应该在共享PC上使用"记住我"功能,因为下一个人将拥有你的身份。合法地。这就是为什么记住我 cookie 也是一种安全风险,它们可以像会话 cookie 一样被劫持。

最后,会话 Cookie 和"记住我"cookie 之间有一个关键区别:过期。会话 Cookie 通常会在您关闭浏览器时(或在您明确指定的时间后)过期,而记住我 Cookie 通常会持续更长时间。

此外,即使用户继续使用 网站?

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

我知道可能会在某些服务器上造成麻烦的一件事是蛋糕的安全级别。尝试将其降低到您的/Config/core.php

Configure::write('Security.level', 'medium'); // or 'low'

如果这没有帮助,那么答案肯定在你的代码中。我希望这个答案能把你推向正确的方向!

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

  2. 也许您每 30 秒访问一次的页面没有启动会话。在这种情况下,不使用会话机制,并且会话的到期日期不会重置为 now + 1 minute 。或者,刷新可能只命中浏览器缓存,而不是服务器。

1.)会话 Cookie 和"记住我"之间的区别在于会话 Cookie 的到期日期为"0"。这意味着"浏览器关闭时过期"。而"记住我"会为同一会话 cookie 提供特定的到期日期,例如一个月后。这是唯一的区别。你可能会认为这种功能差异是微不足道的或毫无意义的,但请考虑一下:在家里,我不想每天晚上都费心登录同一个该死的雅虎帐户,而在工作中,我不想每次我必须去小便时都费心删除我的cookie。

2.) 即使正在使用应用程序,会话 Cookie 也不应过期。您在什么地方以及在什么情况下看到这种行为?这是错误的。

了解安全设置与超时的组合,这是一个非常重要的部分。当安全性设置为高级别时,会话可能会在您预期之前被终止。

旁边是带有内部蛋糕会话存储的测试。这样,本地系统配置就不会影响它。可能是 PHP 设置覆盖了 Cake 中的设置。因此,将会话存储设置为蛋糕。这将创建一个包含您可以控制的会话的目录。

同样,它是服务器设置的组合,并且期望 Cake 的配置确实会覆盖这些服务器设置。

如果我这样做:

    Configure::write('Session', array(
        'start' => true,
        'defaults' => 'cake',
        'timeout' => 1,
        'cookieTimeout' => 1,
        'autoRegenerate' => true
    ));
/**
 * The level of CakePHP security.
 */
    Configure::write('Security.level', 'high');

它解决了这个问题!所以会话持续 10 秒,但如果我每 2-3 秒刷新一次,那么当 cookie 刷新时,我仍将在 10 秒后登录。所以似乎我的托管环境的 PHP 设置正在/正在导致过期的会话/cookie......为什么会这样呢?