代码之家  ›  专栏  ›  技术社区  ›  Ben

PHP会话变量是否足以进行用户身份验证?

  •  4
  • Ben  · 技术社区  · 14 年前

    脚本:

    • 用户登录后,设置会话变量以确认其登录。
    • 在每个页面的顶部,确认登录会话变量有效
    • 如果不是的话,他们就被赶出去了。
    • 不使用持久性cookie,仅 session

    问题:

    这是一个足够强大的安全措施本身,还是我应该

    • 设置两个会话变量以验证彼此和/或
    • 实现数据库/哈希验证
    • ……?

    不受欢迎的=

    (顺便说一下,当我研究这个问题时, this wiki 是一本很棒的书。)

    5 回复  |  直到 11 年前
        1
  •  6
  •   zerkms    14 年前

    if (!isset($_SESSION['hash']) {
        $_SESSION['hash'] = md5(!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'no ua');
    } else if ($_SESSION['hash'] != md5(!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'no ua')) {
        session_regenerate_id();
        $_SESSION = array();
        $_SESSION['hash'] = md5(!empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'no ua');
    }
    

    abstract class Session extends Kohana_Session
    {
        public function read($id = null)
        {
            parent::read($id);
    
            $hash = $this->calculateHash();
            $sessionHash = $this->get('session_fixation');
    
            if (!$sessionHash) {
                $this->set('session_fixation', $hash);
            } elseif ($sessionHash != $hash) {
                $this->regenerate();
                $_SESSION = array();
                $this->set('session_fixation', $hash);
            }
        }
    
        private function calculateHash()
        {
            $ip = !empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
            $ua = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'no ua';
            $charset = !empty($_SERVER['HTTP_ACCEPT_CHARSET']) ? $_SERVER['HTTP_ACCEPT_CHARSET'] : 'no charset';
            $ip = substr($ip, 0, strrpos($ip, '.') - 1);
            return md5($ua . $ip . $charset);
        }
    }
    
        2
  •  2
  •   Brian    14 年前

    This is a good read

    $_SESSION['fingerprint'] = md5('somethingSecret' . $_SERVER['HTTP_USER_AGENT']. session_id());

    $check_print = md5('somethingSecret' . $_SERVER['HTTP_USER_AGENT']. session_id());
    
    if($check_print != $_SESSION['fingerprint'] || $_SESSION['authenticated']){ 
        //invalid session
    }
    
        4
  •  1
  •   Charlotte    14 年前

    $_SESSION $_SESSION["reportedUA"] = $_SERVER["HTTP_USER_AGENT"] reportedUA

        5
  •  0
  •   alfadog67    11 年前