为什么在CodeIgniter中需要更新会话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);
}
答案 0 :(得分:4)
出于安全考虑,这是为了防止欺骗。会话已加密并存储在您的Cookie中。任何人都可以复制您的Cookie并转到另一台PC并登录。
假设会话未到期。这意味着,如果我到您的PC并窃取您的cookie,我可以从任何地方登录,因为我在Cookie中加密了您的会话ID。如果框架每5分钟更新一次会话,这几乎是不可能的。
如果您不喜欢它的工作方式,您可以通过从Codeigniter的核心系统扩展一个来为Sessions创建自己的库。虽然没有这样做。
答案 1 :(得分:1)
这是一项安全功能。
google for
会话劫持 会话固定
例如,您应该至少在用户登录系统时更改会话ID。
应通过登录创建新会话的用户分配一个 使用session_regenerate_id函数的新会话ID。劫持 用户将尝试在登录前设置其会话ID;这可以 如果您在登录时重新生成ID,则会被阻止。
您可以在此处详细了解会话安全性:
php security best practices
how-to-create-bulletproof-sessions