2017-03-15 40 views
4

我想使用session_id()獲取會話ID;但我知道它會在每5分鐘後重新生成一次。在codeigniter中獲取唯一的會話ID

所以我有一個把隨機數設置成用戶定義的會話變量的技巧。像,

$uniqueId = uniqid(rand(), TRUE); 
$this->session->set_userdata("my_session_id", md5($uniqueId)); 

現在問題是我應該在哪裏放置此代碼。如果我把這段代碼放在我的控制器的構造函數中,它會在每個請求中執行。並會爲每個請求提供不同的會話ID。

如何設置此會話變量只有一次?並且在會話銷燬之前它不會改變()。

+1

在登錄控制器時,當您成功登錄後將用戶重定向並將數據保存在會話中 –

+0

但我還想爲訪客用戶分配session_id。 –

+0

http:// stackoverflow。com/questions/13945603/how-do-codeigniters-sess-time-to-update-work,這可能有幫助 –

回答

0

在config.php中設置下面的,那麼你就不必生成自己的會話ID

$config['sess_expiration'] = 0;//Session does not expire 
$config['sess_time_to_update'] = 0;//Disable session ID regeneration 

在你的控制器,你需要__construct()

public function __construct(&$params){ 
    // DO NOT forget this 
    parent::__construct($params); 
} 

那麼您什麼時候得到您要使用的會議

$this->session->userdata('id'); 
+0

我可以設定這個時間,但現在會發生什麼。我得到$ session_id = session_id();在構造函數中。理想情況下,每次執行這個函數都會發生什麼,$ session id保持不變。但每次調用函數都會改變它。如何解決這個問題? –

+0

看到我的更新回答 – theEUG

1

在您的constructor chec ķ會議already set or not。如果第一次會議是否也不會設置set it否則do nothing。像這個..

$uniqueId = uniqid(rand(), TRUE);//generates random number 
if(!$this->session->has_userdata('my_session_id'))//if session is not set then it sets (if your session has already value then this step will be skip out) 
{ 
$this->session->set_userdata("my_session_id", md5($uniqueId)); 
} 
+0

對每個請求控制進入如果條件,並重置值。我只是不明白爲什麼它返回false has_userdata('my_session_id')??並執行如果語句 –

+0

任何想法爲什麼它重置my_session_id變量? –

+3

編寫'$ uniqueId = uniqid(rand(),TRUE);'if if if;)會更好些 – ICE

2
  1. 這是更好地再生會話ID爲防止對會話劫持。禁用會話Id再生是不好的想法。請閱讀When and why I should use session_regenerate_id()?瞭解更多信息。

  2. 如果您想通過會話識別用戶,那麼使用會話ID並不是一個好主意。

  3. 您可以在會話中設置用戶標識並將其用作登錄的標識。爲了更安全,您可以將隨機字符串作爲密鑰存儲在數據庫中,並將其設置在會話中。在檢查時,您可以將會話中的用戶ID和該密鑰與數據庫上的用戶ID和密鑰進行比較。

  4. 如果您想爲客戶的客戶同樣的事情,你可以做什麼,我在#3提到和存儲$_SESSION['guest']=USER_IP和存儲來賓IP數據庫上創建一個客桌。並且如果isset($_SESSION['guest'])檢查訪客表而不是用戶表。

  5. 如果您希望保護會話免受XSS影響,您可以存儲其他用戶信息,例如IP,並在代碼開始時檢查該信息。

-1

使用PHP的內置功能:

$session_id = session_id(); 

現在$session_id是一個獨特的會話ID。