使用regenerateId()时Zend_Session丢失

时间:2009-04-03 11:26:47

标签: php zend-framework session

我现在在几个ZF应用程序中遇到了这个问题,这非常令人沮丧:

在我的引导程序顶部附近,我有以下两行

Zend_Session::start();
Zend_Session::regenerateId();

我的应用程序需要使用Zend_Auth进行身份验证,并使用默认会话存储来保留身份。随机会话丢失,从而产生用户已注销的效果。如果我删除对Zend_Session :: regenerateId()的调用,则会话不会丢失。

重新生成会话ID可提高安全性,因此我希望能够正常运行。我的本地开发服务器(Windows)和我们的登台服务器(linux)

都会出现此问题

3 个答案:

答案 0 :(得分:5)

阅读完问题后,我一直在寻找解决问题的方法。实际上根据Zend Framework:文档解决方案很容易。

“如果用户已成功登录您的网站,请使用rememberMe()而不是regenerateId()。”

我希望这会帮助你。

问候,

尤尼斯

[编辑:这是我找到的地方的链接:Zend Framework: Documentation

答案 1 :(得分:4)

我和Zend_Session有一个相关的问题。由于以下问题,您的会话可能已丢失:

尝试使用:

Zend_Session::rememberMe(100); // any value here

然后使用会话数据集(例如用户登录)转到应用程序中的任何页面,并快速点击浏览器的刷新按钮(如双击)3-5次。你会看到你的会话数据已经消失了:(

我能解决这个问题的唯一方法是暂时不使用rememberMe()方法。我希望有人能在这里阐明这个问题。我认为regenerateId()方法会以某种方式混淆cookie值,以便从浏览器到服务器的后续调用不会与现有会话ID相关联。

答案 2 :(得分:0)

使用会话cookie时遇到同样的问题,当cookie到期时一切正常。

使用“记住我”功能时,过期日期设置为作为参数给出的秒数。

我的解决方案是在创建新的Zend_Application之后和调用$application->bootstrap()->run();之前将会话重新生成代码放在index.php中,每5个请求重新生成一次id。

/** Zend_Application */
require_once 'Zend/Application.php';


// Create application, bootstrap, and run
$application = new Zend_Application(
                APPLICATION_ENV,
                APPLICATION_PATH . '/configs/application.ini'
);

// set httponly option (when set in application.ini it dosent work) 
Zend_Session::setOptions(array('cookie_httponly' => true));

//regenerate sessionid after 5 hits
$defaultNamespace = new Zend_Session_Namespace();
if ($defaultNamespace->initialized > 3) {
    Zend_Session::regenerateId();
    $defaultNamespace->initialized = 0;
} else {
    $defaultNamespace->initialized++;
}

//run application
$application->bootstrap()->run();