2014-05-23 31 views
0

这是我使用初始化我会话代码:session_regenerate_id(真)复位会话变量

class session { 
    public static function init() { 
     session_start(); 
     session_regenerate_id(true); 

     if (self::get('validSession') !== true) {    
      //start 
      session_unset(); 
      session_destroy(); 
      session_start(); 
      self::set('validSession', true); 
      //end 
     } 

    } 

    public static function set($key, $value) { 
     $_SESSION[$key] = $value; 
    } 

    public static function get($key) { 
     if (isset($_SESSION[$key])) 
      return $_SESSION[$key]; 
     else 
      return false; 
    } 
} 

的问题是,//start//end之间的部分被称为所有的时间,这将导致旧的会话被毁坏。当我删除session_regenerate_id(true);,一切似乎都做工精细,除了会话ID没有变化(这是一个很大的安全漏洞)

+2

你知道丢弃ID *和* DATA是'session_regenerate_id(true)'的目的吗? – mario

+0

http://www.php.net/manual/en/function.session-regenerate-id.php'“session_regenerate_id()会用新的ID替换当前的会话ID,并保留当前的会话信息。”' – Jonan

+0

http://www.php.net/manual/en/function.session-regenerate-id.php ** delete_old_session **是否删除旧的关联会话文件。 – mario

回答

0

需要密切写会话数据session_write_close(),并与再生SID

public static function init() { 
    session_start(); 

    if (self::get('validSession') !== true) {    
     //start 
     session_write_close(); 
     session_unset(); 
     session_destroy(); 
     session_start(); 
     session_regenerate_id(true); 
     self::set('validSession', true); 
     //end 
    } 

} 
启动新的会话
+0

'警告:session_destroy()[function.session-destroy]:调用'if(){}'部分时尝试销毁未初始化的会话'并且不会放置'session_regenerate_id(true);'after 'session_start'没有任何用处,因为'session_start'反正会产生一个新的'id'? – Jonan

+0

尝试unset,destroy,close,start – newage