如果我快速单击浏览器后退按钮两次,用户将在我们的蛋糕应用程序中注销

时间:2011-04-20 19:38:40

标签: session cakephp cakephp-1.3 browser-history

这是一个奇怪的错误,我甚至不知道如何开始弄清楚发生了什么。

我们正在将Cake 1.3.8与数据库中的会话结合使用。我没有使用ACL或任何其他访问控制。如果我们导航到应用程序并点击一下,然后快速点击浏览器后退按钮两次(我已尝试在Firefox和Chrome中),用户会更频繁地注销并收到错误消息“您未经授权访问该位置'。

到目前为止,我的所有搜索都涉及到想要在用户注销然后使用后退按钮时无法访问页面的人。关于我所看到的问题,我没有看到任何报道。

有人知道这是一个Cake问题,还是有任何关于调试出错的想法?​​

更新:我发现了问题所在。我将安全性设置为高,因为只要有人关闭浏览器,我们就需要关闭会话。我也将超时设置得非常高,因为我们对S3进行大量二进制上传,并且不希望用户在上传或下载时注销。 Cake_sessions.php中导致问题的特定代码块是:

$time = $this->read('Config.time');
                $this->write('Config.time', $this->sessionTime);
                if (Configure::read('Security.level') === 'high') {
                    $check = $this->read('Config.timeout');

                    $check -= 1;
                    $this->write('Config.timeout', $check);

                    if (time() > ($time - (Security::inactiveMins() * Configure::read('Session.timeout')) + 2) || $check < 1) {

                        $this->renew();
                        $this->write('Config.timeout', 10);
                    }
                }
                $this->valid = true;

3 个答案:

答案 0 :(得分:1)

会话可能会被删除,在再次写入会话之前,单击后退按钮会从会话变量中删除身份验证。

网页加载 - &gt;后退按钮点击 - &gt;会话被删除(但在会话被重写之前) - &gt;后退按钮点击 - &gt;会话检查没有现有会话。

答案 1 :(得分:1)

我猜这是因为当security = high时会在请求之间重新生成会话ID。来源:

http://book.cakephp.org/compare/44/CakePHP-Core-Configuration-Variables/cakephp/cakephp1x

您只需要一个不同步请求,例如丢失图像,您将失去会话。我一般认为它不可行,因为不可能阻止用户双击链接和按钮并使其会话无效。

我会考虑使用中等安全性,将会话超时设置得相当短,并使用AJAX脚本定期刷新会话(例如每60秒)。这样,如果选项卡/窗口关闭,用户将快速注销。

如果安全性是优先考虑的话,我会建议破解核心,以确保会话cookie设置为http_only,以防止XSS攻击导致的会话劫持。 Cakephp 1.x支持PHP4,因此默认情况下可能没有设置它。

http://php.net/manual/en/function.setcookie.php

答案 2 :(得分:0)

我能想到的唯一事情就是,当你过快地返回一个页面时,你的代码无法足够快地验证这个人(从检查凭据​​往返)并抛出一个错误显示在加载的下一页(第二个备份页面)。

你确定这个人实际上已经退出了,还是只是抛出了错误?

如果没有看到任何代码,将很难再进一步确定。