PHP会话足够用户身份验证吗?

Ben*_*Ben 4 php security session login

场景:

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

题:

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

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

========

(顺便说一句,在我研究这个问题时,这个wiki是一个很棒的读物.)

zer*_*kms 6

仅在会话中存储用户登录(或用户ID)就足够了.

为了防止会话固定/劫持你需要的一切只是实现简单的algorythm(伪代码):

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');
}
Run Code Online (Sandbox Code Playgroud)

您可以将哈希计算移动到某个函数中以防止重复,我刚刚展示了可能的保护草图.

这就是我在kohana会话课中实现这种保护的方式:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)