Как сбросить сессию по каждому запросу? - PullRequest
0 голосов
/ 19 ноября 2011
            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;
    }
}

Итак, я прочитал эту статью о том, как кто-то может получить доступ к учетной записи с идентификатором сеанса.Одним из перечисленных решений было сбросить идентификационный номер сеанса при каждой загрузке страницы.Будет ли это безопасным воплощением этой идеи?


Спасибо всем за предложения, вот что я сделал, чтобы их использовать:

        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 ]

3 голосов
/ 19 ноября 2011

Массовое излишнее ... session_destroy не удаляет cookie сессии, оно просто делает

$ _ SESSION = array ()

и стирает данные сеанса на стороне сервера. Чтобы предотвратить кражу файла cookie сеанса, вы должны использовать session_regenerate_id() для создания нового идентификатора сеанса.

1 голос
/ 19 ноября 2011

Если идентификатор сеанса обновляется каждый раз, когда происходит изменение уровня привилегий, риск фиксации сеанса практически исключен:

session_regenerate_id ()

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

Я не рекомендую восстанавливать идентификатор сеанса на каждой странице. Хотя это кажется безопасным подходом - и это так - он не дает больше защита, чем восстановление идентификатора сеанса всякий раз, когда есть изменение уровня привилегий. Что еще более важно, это может неблагоприятно повлиять на ваших законных пользователей, особенно если идентификатор сеанса распространяется в URL. Пользователь может использовать историю браузера механизм возврата на предыдущую страницу и ссылки на этой странице будет ссылаться на идентификатор сеанса, который больше не существует. если ты восстановить идентификатор сеанса только при изменении уровень привилегий, такая же ситуация возможна, но пользователь, который возвращается на страницу до изменения уровня привилегии менее вероятно, чтобы быть удивленным потерей сессии, и этой ситуацией также менее распространен.

Для получения дополнительной информации см. http://phpsecurity.org/ch04.pdf.

1 голос
/ 19 ноября 2011

Вы должны использовать [session_unset()][1] и [session_destroy()][2] оба. Обратите внимание, что session_destroy() очищает переменные только тогда, когда страница перезагружается или перенаправляется на другую страницу. Пока это одна и та же страница, переменные по-прежнему могут использоваться после вызова [session_destroy()][3], поэтому рекомендуется использовать [session_unset()][5] непосредственно перед [session_destroy()][4].

0 голосов
/ 19 ноября 2011

Я бы добавил IP-адрес в сеанс и проверял бы его при каждом запросе пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...