如何重置每个请求的会话?

时间:2011-11-19 16:32:01

标签: php session

            class userSessionManager
{
    public $_uname;
    private $_pword;
    private $_userDB_Accessor;

    function __construct($userAccessor)
    {
        $this->_userDB_Accessor = $userAccessor;            
    }
    function tryLogin()
    {
        //  get user information
        if ($_SERVER['REQUEST_METHOD'] == 'POST')
        {
            // get username and pasword from POST data and make it safe for database
            $this->_uname = quote_smart(htmlspecialchars($_POST['userName']));
            $this->_pword = quote_smart(htmlspecialchars($_POST['password']));
        }
        else // username and password were not set
        {
            return false;
        }

        $loginPassed = $this->_userDB_Accessor->login($this->_uname, $this->_pword);

        if($loginPassed == true)
        {
            $this->makeSession();
        }

        return $loginPassed;
    }
    private function makeSession()
    {
        session_start();
        $_SESSION['userName'] = $this->_uname;
    }
    function userHasSession()
    {
        session_start();
        if(! isset($_SESSION['userName']))  // session not properly created
        {
            return false;
        }

        $this->_uname = $_SESSION['userName'];  //save username to object

        //destroy and recreate session for security reasons
        session_destroy();
        $this->makeSession();
        return true;
    }
}

因此,我阅读了this有关某人如何使用会话ID号访问帐户的文章。列出的一个解决方案是每次加载页面时重置会话ID号。这会是这个想法的安全实现吗?


谢谢大家的建议,这就是我使用它们所做的:

        private function makeSession()
    {
        session_start();
        session_regenerate_id();    // reset session id for securty
        $_SESSION['userName'] = $this->_uname;
        $_SESSION['userIP'] = $_SERVER['REMOTE_ADDR'];
        $_SESSION['userBrowser'] = $_SERVER['HTTP_USER_AGENT'];
    }
    function userHasSession()
    {
        session_start();

        if(!isset($_SESSION['userName']) || // check for a created user
            $_SESSION['userIP'] != $_SERVER['REMOTE_ADDR'] || // check for the same IP address
            $_SESSION['userBrowser'] != $_SERVER['HTTP_USER_AGENT'] //check for same Browser and OS
            ) 
        {
            session_regenerate_id();
            session_unset();
            session_destroy();
            return false;
        }
        return true;    // legit user
    }

4 个答案:

答案 0 :(得分:3)

Massable overkill ... session_destroy不会删除会话cookie,它基本上就是

$ _ SESSION = array()

并删除服务器端会话数据。为防止窃取会话cookie,您必须使用session_regenerate_id()生成新的会话ID。

答案 1 :(得分:1)

您应该同时使用[session_unset()][1][session_destroy()][2]。请注意,session_destroy()仅在重新加载页面或重定向到其他页面时清空变量。只要它是同一页面,变量在调用[session_destroy()][3]后仍然可用,因此最好在[session_unset()][5]之前使用[session_destroy()][4]

答案 2 :(得分:1)

如果每次特权级别发生更改时都会重新生成会话标识符, 实际上消除了会话固定的风险:

session_regenerate_id()

<?php
$_SESSION['logged_in'] = FALSE;
if (check_login())
{
session_regenerate_id();
$_SESSION['logged_in'] = TRUE;
}
?>
  

我不建议在每个页面上重新生成会话标识符。   虽然这似乎是一种安全的方法 - 而且它不再提供   保护,而不是每当有重新生成会话标识符   特权级别的变化。更重要的是,它可能会产生不利影响   影响您的合法用户,尤其是会话标识符   在URL中传播。用户可能会使用浏览器的历史记录   返回上一页的机制,以及该页面上的链接   将引用不再存在的会话标识符。如果你   只有在更改时才重新生成会话标识符   特权级别,同样的情况是可能的,但是用户是谁   返回到权限级别更改之前的页面   失去会话和这种情况不太可能感到惊讶   也不常见。

有关详细信息,请查看http://phpsecurity.org/ch04.pdf

答案 3 :(得分:0)

我会将IP地址添加到会话中并检查用户的每个请求。