【问题标题】:Get unique Session id in codeigniter在 codeigniter 中获取唯一的 Session id
【发布时间】:2017-08-06 03:38:56
【问题描述】:

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

所以我得到了一个技巧,可以将随机数设置为用户定义的会话变量。喜欢,

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

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

我怎样才能只设置一次这个会话变量?直到 session destroy() 才会改变。

【问题讨论】:

  • 在成功登录后重定向用户并在会话中保存数据时在登录控制器中
  • 但我也想为访客用户分配一个 session_id。
  • stackoverflow.com/questions/13945603/… ,这可能会有所帮助
  • 尝试读取构造函数中的my_session_id。如果它已经存在,请不要运行 setter。
  • 请问您为什么要这样做?是因为保护 Session ID 免受 XSS 攻击吗?

标签: php codeigniter session


【解决方案1】:

使用php的内置函数:

$session_id = session_id();

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

【讨论】:

  • 在 CI3 中,会话 ID 存储在 cookie 数据中。如果你检查你的浏览器,你可以看到它。我相信 session_id() 是获取会话 id 的正确方法,因为 CI3 现在可以与 $_SESSION 超级全局一起使用。
【解决方案2】:
  1. 最好重新生成会话 ID 以防止会话劫持。 禁用会话 ID 重新生成是个坏主意。阅读When and why I should use session_regenerate_id()?了解更多信息。

  2. 如果你想通过会话来识别用户,使用 Session Id 不是一个好主意。

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

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

  5. 如果你想保护你的会话免受 XSS 攻击,你可以在你的数据库中存储另一个用户信息,例如 IP,并在你的代码开始时检查。

【讨论】:

    【解决方案3】:

    在您的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)); 
    }
    

    【讨论】:

    • 在每个请求控制进入 if condition ,并重置值。我只是不明白为什么它返回 false has_userdata('my_session_id') ??并执行 if 语句
    • 知道为什么它会重置 my_session_id 变量吗?
    • 最好在 if 里面写$uniqueId = uniqid(rand(), TRUE); ;)
    【解决方案4】:

    在config.php中设置如下,就不用自己生成session 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');
    

    【讨论】:

    • 我可以设置这个时间,但现在会发生什么。我得到 $session_id = session_id();在构造函数中。理想情况下,每次执行此函数时应该发生什么,$session id 保持不变。但它在每次函数调用时都会发生变化。如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-01-01
    • 2019-11-27
    相关资源
    最近更新 更多