【问题标题】:Zend_Session lost when using regenerateId()使用 regenerateId() 时 Zend_Session 丢失
【发布时间】:2010-10-17 08:18:43
【问题描述】:

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

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

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

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

重新生成会话 id 可以提高安全性,所以我想让它工作。这个问题发生在我的本地开发服务器(windows)和我们的登台服务器(linux)上

【问题讨论】:

  • 您是否在使用带有非默认参数的 Zend_Cache_Frontend_Page?

标签: php zend-framework session


【解决方案1】:

我在使用会话 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();

【讨论】:

    【解决方案2】:

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

    试试这个:

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

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

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

    【讨论】:

    • 你说得对——我在发出异步请求时经常遇到这种情况,因为它们会导致竞争条件,并且旧的会话 ID 会覆盖最新的会话 ID。我读过的最好的建议是在状态发生变化时重新生成会话 ID,即用户登录,而不是在每个页面上。这样可以避免会话固定攻击。
    【解决方案3】:

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

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

    希望对你有所帮助。

    您好,

    尤尼斯

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

    【讨论】:

    • 似乎有效 - 我已阅读文档但不承认其相关性。查看源代码,我不知道它为什么起作用 - 它似乎只是在设置会话到期日期/时间后调用 regeneratedId 。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2011-10-13
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多