6

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

5 回答 5

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

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

于 2012-06-20T20:16:04.413 回答
8

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

所以让我们从#1 开始。

那么,记住我会为聚会带来什么?

这里需要区分的重要一点是“会话 cookie”和“记住我的 cookie”之间的区别。

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

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

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

继续“记住我”部分。

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

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

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

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

即使用户继续使用网站,会话如何过期?

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

我知道可能会在某些服务器上引起问题的一件事是 cake 的安全级别。尝试降低它在你的/Config/core.php

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

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

于 2012-06-24T12:35:19.373 回答
1

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

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

于 2012-06-23T21:02:36.230 回答
1

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

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

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

于 2012-06-24T12:08:41.867 回答
0

如果我这样做:

    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 秒刷新一次,那么我仍然会在 10 秒后登录,因为 cookie 正在刷新。因此,似乎我的托管环境的 PHP 设置正在/正在导致会话/cookie 过期......为什么会发生这种情况?

于 2012-06-24T12:35:42.883 回答