Php 使用REGENATID()时Zend_会话丢失

Php 使用REGENATID()时Zend_会话丢失,php,zend-framework,session,Php,Zend Framework,Session,我现在在几个ZF应用程序中遇到了这个问题,这非常令人沮丧: 在引导程序的顶部,我有以下两行代码 Zend_Session::start(); Zend_Session::regenerateId(); 我的应用程序需要使用Zend_Auth进行身份验证,并使用默认会话存储来持久化身份。会话随机丢失,造成用户已注销的效果。如果删除对Zend_Session::regenaid()的调用,则会话不会丢失 重新生成会话id可以提高安全性,因此我希望它能够正常工作。这个问题发生在我的本地开发服务器(w

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

在引导程序的顶部,我有以下两行代码

Zend_Session::start();
Zend_Session::regenerateId();
我的应用程序需要使用Zend_Auth进行身份验证,并使用默认会话存储来持久化身份。会话随机丢失,造成用户已注销的效果。如果删除对Zend_Session::regenaid()的调用,则会话不会丢失


重新生成会话id可以提高安全性,因此我希望它能够正常工作。这个问题发生在我的本地开发服务器(windows)和我们的登台服务器(linux)上。

阅读了您的问题后,我一直在寻找解决您问题的方法。实际上,根据Zend框架:文档,解决方案非常简单

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

我希望这能帮到你

您好

尤尼斯


[编辑:这是我找到此链接的地方:

阅读您的问题后,我一直在寻找解决您问题的方法。实际上,根据Zend Framework:Documentation,解决方法非常简单

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

我希望这能帮到你

您好

尤尼斯


[编辑:这是我找到此链接的地方:

我在Zend_会话中遇到了相关问题。您的会话可能由于以下问题而丢失:

尝试使用以下方法:

Zend_Session::rememberMe(100); // any value here
然后使用会话数据集(例如用户登录)转到应用程序中的任何页面,并快速单击浏览器的刷新按钮(如双击)3-5次。您将看到会话数据已消失:(


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

我遇到了Zend_会话的相关问题。您的会话可能由于以下问题而丢失:

尝试使用以下方法:

Zend_Session::rememberMe(100); // any value here
然后使用会话数据集(例如用户登录)转到应用程序中的任何页面,并快速单击浏览器的刷新按钮(如双击)3-5次。您将看到会话数据已消失:(


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

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

使用MemberMe函数时,过期日期设置为秒,作为参数给定

我的解决方案是在创建新的Zend_应用程序之后,在调用
$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();

我在使用会话cookie时也遇到同样的问题,当cookie过期时,一切都正常

使用MemberMe函数时,过期日期设置为秒,作为参数给定

我的解决方案是在创建新的Zend_应用程序之后,在调用
$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();

您是否使用带有非默认参数的Zend_Cache_Frontend_页面?您是否使用带有非默认参数的Zend_Cache_Frontend_页面?似乎有效-我已经阅读了文档,但没有确认其相关性。查看源代码,我不知道它为什么有效-它似乎只是在设置会话到期日期/时间后调用regeneratedId。比KSD似乎有效-我已经阅读了文档,但没有承认它的相关性。查看源代码,我不知道它为什么有效-它似乎只是在设置会话到期日期/时间后调用REGENADID。非常感谢你说的对-我在发出异步请求时经常遇到这种情况,因为它们可能导致竞争条件和旧的SESion ID会覆盖最新的会话ID。我读过的最好建议是在状态发生更改时重新生成会话ID,即用户已登录,而不是在每个页面上。这可以避免会话固定攻击。你说得对-我在发出异步请求时经常遇到这种情况,因为它们可能导致竞争条件和较旧的会话on ID会覆盖最新的ID。我读过的最好建议是在状态发生更改(即用户登录)时重新生成会话ID,而不是在每个页面上。这可以避免会话固定攻击。