如何避免CodeIgniter

时间:2018-06-11 06:25:16

标签: php codeigniter session csrf

我正在创建一个web应用程序,当管理员登录时,他会显示2个选项,

  1. 注销
  2. 检查令牌的有效性。
  3. 一旦管理员登录,他的会话就会启动,并且在该会话中存储他的id和令牌,该令牌有效期为17小时,并且存储在数据库表user_auth中,并且其到期时间为'expired_at(datetime) '和' id(整数)'。如果管理员点击第二个选项,会话中存储的令牌将与数据库中的令牌进行比较,并检查其到期时间。如果令牌匹配且到期,则管理员将显示数据。为此,

    帐户(查看)

    <a href=" <?php echo site_url('admin/logout') ?> ">logout</a>
    <a href=" <?php echo site_url('admin/checkval') ?> ">check valididty of token</a>
    

    admin(控制器)

    public function checkval(){
    
        $this->load->library('session');
    
        $goal = $this->session->userdata('user_id');
        $uid = $goal[0];
        $token = $goal[1];
        $this->load->model('loginmodel');
    
        $check_id = $this->loginmodel->token_valid($uid, $token);
        if($check_id === TRUE){
          $data['query'] = $this->loginmodel->get_last_ten_entries();
           $this->load->view('admin/account', $data);
           print_r($data);
          echo "valid";
        }else {
            echo "invalid";
        }
    
    
    }
    

    Loginmodel(型号)

    public function token_valid($uid, $token)
     {
        $this->db->select('expired_at');
        $this->db->from('user_auth');
        $this->db->where('id',$uid);
        $this->db->where('token',$token);
        $query = $this->db->get();
        if ($query->num_rows() > 0)
        {
            $expired_date = $query->row()->expired_at;
            $expired_date = date_create($expired_date);
         $cdate = date_create('now');
         $interval = date_diff($expired_date,$cdate);
         $hour = $interval->h;
         if($hour <= 17)
         {
           return TRUE;
         }else
         {
           return FALSE;
         }
     }
    }
    

    但问题是如果管理员在浏览器的一个标签中登录,而在另一个标签或窗口我打开控制器的checkval(),即http://localhost/ci/index.php/admin/checkval 数据仍然可见。 我希望数据只显示在管理员已登录的选项卡中,只要打开另一个选项卡,就应该启动新会话。

    我该怎么做?

    感谢您的建议。

0 个答案:

没有答案