2014-05-23 33 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