我正在尝试使用session_id()获取会话ID;但我知道它会在每5分钟后重新生成一次。
所以我有一个把随机数设置到用户定义的会话变量的技巧。喜欢,
$uniqueId = uniqid(rand(), TRUE);
$this->session->set_userdata("my_session_id", md5($uniqueId));
现在问题是我应该在哪里放置此代码。如果我将此代码放在我的控制器的构造函数中,它将在每个请求上执行。并将为每个请求提供不同的会话ID。
如何只设置一次此会话变量?并且在会话destroy()之前不会改变。
答案 0 :(得分:3)
最好重新生成会话ID以防止会话劫持。禁用会话ID重新生成是不好的主意。请阅读When and why I should use session_regenerate_id()?了解详情。
如果您想按会话识别用户,使用会话ID不是一个好主意。
您可以在会话中设置用户ID,并将其用作登录标识。为了更高的安全性,您可以将随机字符串存储为数据库中的键,并将其设置在会话上。在检查时,您可以将会话中的用户ID和密钥与用户ID和数据库上的密钥进行比较。
如果您想为Guest客户端提供相同的功能,您可以执行我在#3上提到的内容并存储$_SESSION['guest']=USER_IP
,并在存储来宾IP的数据库上创建一个来宾表。当isset($_SESSION['guest'])
发生时,您可以检查来宾表而不是用户表。
如果您希望保护会话免受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');