在codeigniter中获取唯一的会话ID

时间:2017-03-15 11:57:02

标签: php codeigniter session

我正在尝试使用session_id()获取会话ID;但我知道它会在每5分钟后重新生成一次。

所以我有一个把随机数设置到用户定义的会话变量的技巧。喜欢,

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

现在问题是我应该在哪里放置此代码。如果我将此代码放在我的控制器的构造函数中,它将在每个请求上执行。并将为每个请求提供不同的会话ID。

如何只设置一次此会话变量?并且在会话destroy()之前不会改变。

4 个答案:

答案 0 :(得分:3)

  1. 最好重新生成会话ID以防止会话劫持。禁用会话ID重新生成是不好的主意。请阅读When and why I should use session_regenerate_id()?了解详情。

  2. 如果您想按会话识别用户,使用会话ID不是一个好主意。

  3. 您可以在会话中设置用户ID,并将其用作登录标识。为了更高的安全性,您可以将随机字符串存储为数据库中的键,并将其设置在会话上。在检查时,您可以将会话中的用户ID和密钥与用户ID和数据库上的密钥进行比较。

  4. 如果您想为Guest客户端提供相同的功能,您可以执行我在#3上提到的内容并存储$_SESSION['guest']=USER_IP,并在存储来宾IP的数据库上创建一个来宾表。当isset($_SESSION['guest'])发生时,您可以检查来宾表而不是用户表。

  5. 如果您希望保护会话免受XSS攻击,您可以在数据库中存储其他用户信息,例如IP,并在代码开头检查。

答案 1 :(得分:1)

constructor首先检查会话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)); 
}

答案 2 :(得分:1)

使用php的内置功能:

$session_id = session_id();

现在$session_id是唯一的会话ID。

答案 3 :(得分: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');