5

为什么在 CodeIgniter 中完全需要更新 session Id。我知道您可以控制在配置中更新会话 ID 的频率。但是为什么他们每 5 分钟(默认)更改一次会话的 ID?

为什么不能创建一次会话并且在会话过期之前使用相同的 id?

更新会话的函数在这里:

/**
 * Update an existing session
 *
 * @access  public
 * @return  void
 */
function sess_update()
{
    // We only update the session every five minutes by default
    if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
    {
        return;
    }

    // Save the old session id so we know which record to
    // update in the database if we need it
    $old_sessid = $this->userdata['session_id'];
    $new_sessid = '';
    while (strlen($new_sessid) < 32)
    {
        $new_sessid .= mt_rand(0, mt_getrandmax());
    }

    // To make the session ID even more secure we'll combine it with the user's IP
    $new_sessid .= $this->CI->input->ip_address();

    // Turn it into a hash
    $new_sessid = md5(uniqid($new_sessid, TRUE));

    // Update the session data in the session data array
    $this->userdata['session_id'] = $new_sessid;
    $this->userdata['last_activity'] = $this->now;

    // _set_cookie() will handle this for us if we aren't using database sessions
    // by pushing all userdata to the cookie.
    $cookie_data = NULL;

    // Update the session ID and last_activity field in the DB if needed
    if ($this->sess_use_database === TRUE)
    {
        // set cookie explicitly to only have our session data
        $cookie_data = array();
        foreach (array('session_id','ip_address','user_agent','last_activity') as $val)
        {
            $cookie_data[$val] = $this->userdata[$val];
        }

        $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid)));
    }

    // Write the cookie
    $this->_set_cookie($cookie_data);
}
4

2 回答 2

4

这是出于安全原因,以防止欺骗。会话被加密并存储在您的 Cookie 中。任何人都可以复制您的 Cookie 并转到另一台 PC 并登录。

假设会话没有过期。这意味着如果我在你的电脑上窃取你的 cookie,我可以从任何地方登录,因为我在 cookie 中加密了你的会话 ID。如果框架每 5 分钟更新一次会话,这几乎是不可能发生的。

如果你不喜欢它的工作方式,你总是可以通过扩展 Codeigniter 核心系统的库来为 Sessions 创建自己的库。虽然不建议这样做。

于 2012-10-08T21:54:15.637 回答
1

这是一项安全功能。

谷歌

会话劫持会话固定

例如,您至少应该在用户登录系统时更改会话 ID。

通过登录创建新会话的用户应使用 session_regenerate_id 函数分配一个新的会话 ID。劫持用户会在登录前尝试设置他的会话 ID;如果您在登录时重新生成 ID,则可以避免这种情况。

您可以在此处阅读有关会话安全的更多信息:

php 安全最佳实践
如何创建防弹会话

于 2012-10-08T21:54:07.943 回答