Native-session 针对代码点火器 2.1.4 进行了修改...这有意义吗?

2023-12-13

有人看到 CI 2.1.4 的修改有问题吗?该类是为 1.7.2 编写的(Github链接)

问题:

1.regenerate_id的用途是什么?是会话 ID 轮换吗?

2.session_write_close的潜在问题是什么(如评论中所示)

3.这个类是否完全实现了 CI 2.1.4 的会话类?

4.为什么过期时使用sess_expiration而不是sess_time_to_update? (当浏览器关闭时,会话 cookie 就会过期。sess_time_to_update 似乎更适合会话轮换。

5.是否有任何已知的错误?

6.如果我在通配符子域(site1.domain.com、site2.domain.com...等)上运行应用程序,cookie 是否仅适用于该子域?我主要关心的是setcookie(session_name(), '', time()-42000, '/');

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Session class using native PHP session features and hardened against session fixation.
*
* @package     CodeIgniter
* @subpackage  Libraries
* @category    Sessions
* @author      Dariusz Debowczyk, Matthew Toledo
* @link        http://www.philsbury.co.uk/index.php/blog/code-igniter-sessions/
*/
class CI_Session {

    var $flashdata_key     = 'flash'; // prefix for "flash" variables (eg. flash:new:message)

    function CI_Session()
    {
        $this->object =& get_instance();
        log_message('debug', "Native_session Class Initialized");
        $this->_sess_run();
    }

    /**
    * Regenerates session id
    */
    function regenerate_id()
    {
        // copy old session data, including its id
        $old_session_id = session_id();
        $old_session_data = $_SESSION;

        // regenerate session id and store it
        session_regenerate_id();
        $new_session_id = session_id();

        // switch to the old session and destroy its storage
        session_id($old_session_id);
        session_destroy();

        // switch back to the new session id and send the cookie
        session_id($new_session_id);
        session_start();

        // restore the old session data into the new session
        $_SESSION = $old_session_data;

        // update the session creation time
        $_SESSION['regenerated'] = time();

        // session_write_close() patch based on this thread
        // http://www.codeigniter.com/forums/viewthread/1624/
        // there is a question mark ?? as to side affects

        // end the current session and store session data.
        session_write_close();
    }

    /**
    * Destroys the session and erases session storage
    */
    function destroy()
    {
        unset($_SESSION);
        if ( isset( $_COOKIE[session_name()] ) )
        {
            setcookie(session_name(), '', time()-42000, '/');
        }
        session_destroy();
    }

    /**
    * Alias for destroy(), makes 1.7.2 happy.
    */
    function sess_destroy()
    {
        $this->destroy();
    }

    /**
    * Reads given session attribute value
    */
    function userdata($item)
    {
        if($item == 'session_id'){ //added for backward-compatibility
            return session_id();
        }else{
            return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
        }
    }

    /**
    * Sets session attributes to the given values
    */
    function set_userdata($newdata = array(), $newval = '')
    {
        if (is_string($newdata))
        {
            $newdata = array($newdata => $newval);
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                $_SESSION[$key] = $val;
            }
        }
    }

    /**
    * Erases given session attributes
    */
    function unset_userdata($newdata = array())
    {
        if (is_string($newdata))
        {
            $newdata = array($newdata => '');
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                unset($_SESSION[$key]);
            }
        }
    }

    /**
    * Starts up the session system for current request
    */
    function _sess_run()
    {
        session_start();

        $session_id_ttl = $this->object->config->item('sess_expiration');

        if (is_numeric($session_id_ttl))
        {
            if ($session_id_ttl > 0)
            {
                $this->session_id_ttl = $this->object->config->item('sess_expiration');
            }
            else
            {
                $this->session_id_ttl = (60*60*24*365*2);
            }
        }

        // check if session id needs regeneration
        if ( $this->_session_id_expired() )
        {
            // regenerate session id (session data stays the
            // same, but old session storage is destroyed)
            $this->regenerate_id();
        }

        // delete old flashdata (from last request)
        $this->_flashdata_sweep();

        // mark all new flashdata as old (data will be deleted before next request)
        $this->_flashdata_mark();
    }

    /**
    * Checks if session has expired
    */
    function _session_id_expired()
    {
        if ( !isset( $_SESSION['regenerated'] ) )
        {
            $_SESSION['regenerated'] = time();
            return false;
        }

        $expiry_time = time() - $this->session_id_ttl;

        if ( $_SESSION['regenerated'] <=  $expiry_time )
        {
            return true;
        }

        return false;
    }

    /**
    * Sets "flash" data which will be available only in next request (then it will
    * be deleted from session). You can use it to implement "Save succeeded" messages
    * after redirect.
    */
    function set_flashdata($newdata = array(), $newval = '')
    {
        if (is_string($newdata))
        {
            $newdata = array($newdata => $newval);
        }

        if (count($newdata) > 0)
        {
            foreach ($newdata as $key => $val)
            {
                $flashdata_key = $this->flashdata_key.':new:'.$key;
                $this->set_userdata($flashdata_key, $val);
            }
        }
    }


    /**
    * Keeps existing "flash" data available to next request.
    */
    function keep_flashdata($key)
    {
        $old_flashdata_key = $this->flashdata_key.':old:'.$key;
        $value = $this->userdata($old_flashdata_key);

        $new_flashdata_key = $this->flashdata_key.':new:'.$key;
        $this->set_userdata($new_flashdata_key, $value);
    }

    /**
    * Returns "flash" data for the given key.
    */
    function flashdata($key)
    {
        $flashdata_key = $this->flashdata_key.':old:'.$key;
        return $this->userdata($flashdata_key);
    }

    /**
    * PRIVATE: Internal method - marks "flash" session attributes as 'old'
    */
    function _flashdata_mark()
    {
        foreach ($_SESSION as $name => $value)
        {
            $parts = explode(':new:', $name);
            if (is_array($parts) && count($parts) == 2)
            {
                $new_name = $this->flashdata_key.':old:'.$parts[1];
                $this->set_userdata($new_name, $value);
                $this->unset_userdata($name);
            }
        }
    }

    /**
    * PRIVATE: Internal method - removes "flash" session marked as 'old'
    */
    function _flashdata_sweep()
    {
        foreach ($_SESSION as $name => $value)
        {
            $parts = explode(':old:', $name);
            if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flashdata_key)
            {
                $this->unset_userdata($name);
            }
        }
    }
}
?>

1.regenerate_id的用途是什么?是会话 ID 轮换吗?

用例是会话固定预防。 NativeSession 根据 NativeSession::$session_id_ttl 属性值每 X 秒重新生成一次会话 ID。它减少了会话劫持的影响,因为“被盗”会话 ID 已过期,并在配置时间后使用 regerate_id() 重新生成。

2.session_write_close的潜在问题是什么(如评论中所示)

一般来说,session_write_close() 用于在会话的所有更改完成后立即摆脱会话写锁定。这可能会导致多帧应用程序加载速度更快(因为更快地允许会话写入访问)。

您不应该添加带有 session_write_close() 的行,因为它会阻止会话 flashdata 机制正常工作。

3.这个类是否完全实现了 CI 2.1.4 的会话类?

不完全是,但应该可以使用它作为 CI_Session 的直接替代品。我将 NativeSession 与 CI2 一起用于 2 个生产应用程序,没有任何问题。

如果您正在寻找可提供与 NativeSession 类似功能的受支持 CI 会话处理程序,请检查 CI2 Github 上的 CI_Session_native。我检查了代码,看起来它部分基于 NativeSession。它还包含一些安全改进。

4.为什么过期时使用sess_expiration而不是sess_time_to_update? (当浏览器关闭时,会话 cookie 就会过期。sess_time_to_update 似乎更适合会话轮换。

您似乎指的是 CI2 会话机制。

  • CI2 中的 sess_expiration 允许设置用户上次活动后会话过期之前的特定时间(以秒为单位)
  • CI2 中的 sess_time_to_update 允许设置用户上次活动后强制重新生成会话 ID 的时间(以秒为单位)

NativeSession 是在 CI2 之前开发的,它使用与 CI Session 不同的参数。

  • session_ttl 相当于 CI2 会话处理程序中的 sess_expiration
  • session_id_ttl 几乎相当于 CI2 会话处理程序中的 sess_time_to_update (NativeSession 不关心最后一个用户的活动 - 只计算自上次会话重新生成以来的时间)

5.是否有任何已知的错误?

我不知道什么,尽管它当然可能包含错误。

6.如果我在通配符子域(site1.domain.com、site2.domain.com...等)上运行应用程序,cookie 是否仅适用于该子域?我主要关心的是 setcookie(session_name(), '' , 时间()-42000, '/');

From PHP docs:“可用于较低域(例如“example.com”)的 Cookie 将可用于较高级子域(例如“www.example.com”)。”

我将此代码与处理子域的应用程序一起使用,没有任何问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Native-session 针对代码点火器 2.1.4 进行了修改...这有意义吗? 的相关文章

随机推荐

  • 按运输方式在感谢页面上添加自定义消息

    仅当订单使用免费送货时 我才尝试向已收到订单 谢谢 页面添加一条消息 该消息可以替换标准的 谢谢 消息 也可以作为补充 这是我正在使用的代码 它基于这里的答案 根据 WooCommerce 中的运输方式自定义订单接收页面 add messa
  • 如何在java中改变new Date()的值

    在我的应用程序中 当测试人员测试应用程序时 需要经常更改日期和时间 目前 我们必须使用系统命令 date s 来更改系统时间 但这会导致服务器上的其他应用程序也受到影响 我只想更改此应用程序的 Date 但我不想想要改变应用程序本身 因为有
  • Inno Setup 获取目录大小(包括子目录)

    我正在尝试编写一个返回目录大小的函数 我编写了以下代码 但它没有返回正确的大小 例如 当我在 pf 它返回 174 字节的目录 这显然是错误的 因为该目录的大小有多个千兆字节 这是我的代码 function GetDirSize DirNa
  • 如何从Python中的请求获取响应SSL证书?

    尝试从响应中获取 SSL 证书requests 有什么好的方法可以做到这一点 requests故意包装这样的低级内容 通常 您唯一想做的就是验证证书是否有效 为此 只需通过verify True 如果您想使用非标准 cacert 包 您也可
  • 根在函数中不起作用[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想在函数中使用matlab函数根 但这不起作用 我不知道如何解决这个问题 这是函数 f
  • 在 PyCharm 中使用 Matplotlib 时如何修复“无法找到或加载 Qt 平台插件窗口”

    在 PyCharm 中使用 matplotlib 时收到错误 无法找到或加载 Qt 平台插件窗口 我该如何解决这个问题 我在 Anaconda3 4 2 0 和 4 3 0 1 64 位 上遇到了同样的问题 当我尝试运行一个使用 matpl
  • 我想捕获一个异常并将其捆绑在我自己的异常中并向上抛出

    我有一个管理资源的类 它需要一个可以从路径检索资源的 Loader 类 Loader 是一个抽象基类 因此任何人都可以创建新的加载器 如果请求的资源不在缓存中 则资源管理器将从加载器请求该资源 如果加载器失败 资源管理器会抛出一个我创建的名
  • 根据服务器数据(纬度和经度)移动MKMapView中的注释

    在我的应用程序中 我通过以特定时间间隔从服务器获取其他人的位置 纬度和经度 来显示其他人的位置 获取后 我必须删除所有注释并根据服务器数据删除新注释 但它看起来效率很低 因为当我们先前存在同一用户的注释时 即使我删除并添加相同的用户注释 所
  • 如何修复 ASP.NET 开发服务器中的端口号

    昨天我正在编写一个独立的 html 网页 每次我查看它时 该文件都在本地主机中运行 因此 我的操作系统 Windows 8 分配了一个端口号 我的文件的路径如下所示 http localhost 2038 Projects test htm
  • M_PI 适用于 math.h,但不适用于 Visual Studio 中的 cmath

    我正在使用 Visual Studio 2010 我读过在 C 中最好使用
  • 如何启动具有标准 bash shell 环境的 java 进程?

    我尝试过研究进程构建器 但我不确定如何将 bash 环境引入到进程中 例如 我使用以下命令来启动我的流程 Process p new ProcessBuilder args start InputStream is p getInputSt
  • 从我的图书馆项目启动主项目的活动

    我有 2 个项目 一个是我的主项目 A 另一个是图书馆项目 B 我想从 B 中的活动启动 A 中的活动 我该怎么做 I Tried startActivity getApplicationContext B class but B clas
  • 我是否使用 GMFBridge.DLL 正确预览/捕获流?

    我正在尝试使用 GMFBuilder 以便我可以预览来自网络摄像头的流并定期保存它 而无需重新启动整个图表 然而 我不确定这是否正确 我试图遵循示例 但代码已更新 情况也发生了变化 我尝试创建 WEbcam gt Smart Tee pre
  • WPF;单击一次;双击文件启动;对比2008年

    我的应用程序仅供我和同事使用 因此我不在乎它是 Click Once 还是复制 exe 我希望能够在 Windows 资源管理器中单击具有给定扩展名的文件 然后启动我的程序并打开该文件 我无法让它捕获文件名 表面上的解决方案 Link 我正
  • 将数据框与 data.table 匹配

    我需要使用另一个矩阵作为标识符 ID MA 用来自长数据帧 DF 的信息填充矩阵 MA 我的三个矩阵的想法 MA ID 创建一个标识符来在大 DF 中查找所需的变量 a b c a ID aa ID ab ID ac b ID ba ID
  • 如何访问 __main__ 范围内的全局变量?

    我对 python 中变量的命名空间和范围感到困惑 假设我有一个 test py coding utf 8 author jason if name main global strName print strName 然后 我定义一个名为
  • 包含指针的原子结构

    include
  • 注册本地通知

    我正在开发一个带有phonegap的IOS应用程序 需要为其设置本地通知 该通知将在每个星期五和指定时间重复 还要求用户决定是否接收本地通知 我建议您阅读以下有关该主题的文章 我发现它非常有帮助 http useyourloaf com b
  • Instagram 视频 iPhone 挂钩

    目前最好的解决方案 https stackoverflow com a 21888830 1786820 我正在尝试做得更好 通过使用从 PhotoRoll 中预先选择的视频文件和预加载的标题打开 Instagram 应用程序 在 Flip
  • Native-session 针对代码点火器 2.1.4 进行了修改...这有意义吗?

    有人看到 CI 2 1 4 的修改有问题吗 该类是为 1 7 2 编写的 Github链接 问题 1 regenerate id的用途是什么 是会话 ID 轮换吗 2 session write close的潜在问题是什么 如评论中所示 3