【问题标题】:Codeigniter session cookies and remember me optionCodeigniter 会话 cookie 并记住我选项
【发布时间】:2011-09-17 14:47:30
【问题描述】:

您好,我正在编写身份验证登录功能,我需要添加典型的记住我复选框以使会话不会过期。

这样做的最佳做法是什么?

我想过添加一个cookie并存储在用户ID中,然后当用户第一次浏览网站时,检查该cookie,如果存在我从cookie中获取用户ID并创建会话,这是正确的怎么做?安全呢?

【问题讨论】:

    标签: php session codeigniter cookies


    【解决方案1】:

    我会这样做:

    创建一个名为“remember_code”的列,并在他们勾选“记住我”时随机生成哈希

    使用 remember_code 和用户身份(登录用户名或电子邮件)设置 Cookie。

    当他们尝试重新登录时,请检查以下两项:数据库中的 remember_code 以及用户名/电子邮件,如果正确,则自动登录。

    这种做法通常是安全的,但要仔细检查,您可以检查 IP 或用户代理以确保是正确的用户。

    【讨论】:

      【解决方案2】:

      我在 CodeIgniter 3 上实现了一些不同的解决方案。

      我将记住我选项视为仅延长会话时间。 IE。标准会话时间为 2 小时,延长 7 天。

      这样做:

      1 - 在表单中添加记住我复选框和隐藏字段

      echo form_hidden('remember_me', '0');
      echo form_checkbox('remember_me', '1');
      

      2 - 在配置中添加以下内容 (config.php)

      $config['sess_expiration'] = 72000; // standard time, 2hrs
      $config['sess_extended_expiration'] = 604800; // extended time, 7 days
      

      3 - 在application/libraries/Session 目录中创建MY_Session.php

      4 - 将以下代码放入其中

      <?php
      
      defined('BASEPATH') OR exit('No direct script access allowed');
      
      class MY_Session extends CI_Session {
      
          public function __construct(array $params = array())
          {
              parent::__construct($params);
      
              // No session time manipulation
              if (!isset($this->_config['sess_extended']))
              {
                  return $this;
              }
      
              if ($this->_config['sess_extended'])
              {
                  // Remember for next regenerate execs
                  setcookie(
                      'remember_me',
                      '1',
                      (empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']),
                      $this->_config['cookie_path'],
                      $this->_config['cookie_domain'],
                      $this->_config['cookie_secure'],
                      TRUE
                  );
              }
              else
              {
                  // Forget remember me
                  setcookie(
                      'remember_me',
                      NULL,
                      -1,
                      $this->_config['cookie_path'],
                      $this->_config['cookie_domain'],
                      $this->_config['cookie_secure'],
                      TRUE
                  );
              }
          }
      
          protected function _configure(&$params)
          {
              // Restore standard session time
              if (filter_input(INPUT_POST, 'remember_me') === '0')
              {
                  $params['sess_extended'] = false;
                  return parent::_configure($params);
              }
              // Extend session time
              elseif (filter_input(INPUT_POST, 'remember_me') === '1' || (isset($_COOKIE['remember_me']) && !empty($_COOKIE['remember_me'])))
              {
                  if (!empty(config_item('sess_extended_expiration')))
                  {
                      $_config[0] = & get_config();
                      $_config[0]['sess_expiration'] = config_item('sess_extended_expiration');
                      $_config[0]['sess_time_to_update'] = 0;
      
                      $params['sess_extended'] = true;
                  }
              }
      
              return parent::_configure($params);
          }
      
      }
      

      没有安全隐患,这只是延长会话时间。

      还要记住服务器必须允许较长的会话时间。您可以通过

      检查当前超时
      var_dump(ini_get('session.gc_maxlifetime'));
      

      【讨论】:

        猜你喜欢
        • 2013-02-20
        • 1970-01-01
        • 2011-01-13
        • 2011-12-10
        • 2018-01-20
        • 2011-04-28
        • 2020-05-04
        • 2012-12-04
        • 1970-01-01
        相关资源
        最近更新 更多