Создает ли мой пользовательский сеанс session_start() совершенно новый сеанс, а не возобновляет текущий сеанс?

Похоже, что мой пользовательский session_start() создает новый сеанс, а не возобновляет текущий сеанс на разных страницах. Вот метод:

public function sec_session_start()
        {
            $session_name = 'sec_session_id'; //set a custom session name
            $secure = false; //set to true if using https
            $httponly = true; //This stops javascript being able to access the session id

            ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies
            $cookieParams = session_get_cookie_params(); //Gets currtent cookies params
            session_set_cookie_params($cookieParams["lifetime"], $cookieParams["domain"], $secure, $httponly); 
            session_name($session_name); //Sets the session name to the one set above
            session_start(); //Start the php session
            session_regenerate_id(true); //regernates the session, delete the old one
        }

Проблема, с которой я сталкиваюсь, связана с суперглобальной переменной $_SESSION. Например, на моей странице входа я генерирую случайный токен для предотвращения CSRF атак:

$token = md5(uniqid(mt_rand(), true));
$_SESSION['token'] = $token; //Add randomly generated token to superglobal variable
...
<input type="hidden" name="siteToken" value="$token" />

Затем я проверяю правильное значение токена на моей странице обработки php:

//Check Token Values (prevent CSRF attacks)
    if($passedToken != $_SESSION['token']) {
        $error = "CSRF attack detected. Please close your browser and try again."; 
        $signIn->csrfAttackLog($username);
        echo $error;
        exit();     
    }

Проблема возникает на моей php странице обработки: Notice: Undefined index: token in... Очевидно, моя переменная сеанса не была перенесена. Я запустил еще одну sec_session_start() на странице обработки, так что дело не в том, что я забыл продолжить сеанс. Кажется, началась совершенно новая сессия. Я проверил первую страницу по "printing" значению $_SESSION.

Любой вклад приветствуется.

РЕДАКТИРОВАТЬ: $passedToken правильно. Существует промежуточный шаг, который приравнивает значение $_POST к этой переменной.


person Mlagma    schedule 28.06.2013    source источник


Ответы (2)


Хорошо, надеюсь, я правильно понял. Вы пытаетесь сохранить один сеанс (с тем же идентификатором, в одном файле cookie), просто несколько токенов и тому подобное, чтобы сделать его более безопасным. Но, как упоминается в вашем последнем абзаце, вы вызываете sec_session_start(); при каждом запросе страницы, чтобы поддерживать сеанс, верно? Но вы заметили, что тогда вы также называете session_regenerate_id(true);? Таким образом вы удалите старые файлы сеанса и создадите совершенно новый сеанс, который будет пустым.

person Avinor    schedule 28.06.2013
comment
Хороший улов. На самом деле у меня есть только session_regenerate_id() в моем текущем коде - я отбросил true. - person Mlagma; 29.06.2013
comment
Извините, что так долго не отвечал. Но да, я просмотрел весь свой код. На самом деле я обнаружил, что мой мастер-класс пытался включить эту функцию. Это странно, потому что этому классу не нужен этот файл - я не знаю, почему он там был. Спасибо за ваш вклад. - person Mlagma; 01.07.2013

см. в форме у вас name="siteToken" но в состоянии if($passedToken !=. Я полагаю, должно быть if($siteToken !=. Также попробуйте позвонить sec_session_start до if

person Oleksandr IY    schedule 28.06.2013
comment
Я думал отредактировать свой пост. Есть промежуточный шаг: я взял переданное значение $_POST и приравнял его к $passedToken. - person Mlagma; 28.06.2013
comment
Непосредственно перед if? Я назвал это раньше, потому что я пишу и повторяю переменные до этого момента. - person Mlagma; 28.06.2013
comment
Вы пробовали это: sec_session_start(); if($passedToken!= $_SESSION['токен']){ - person Oleksandr IY; 28.06.2013
comment
Да, я только что сделал. К сожалению, это не сработало. Я довольно озадачен. - person Mlagma; 28.06.2013
comment
затем убедиться, что sec_session_start();$token = md5(uniqid(mt_rand(), true)); - person Oleksandr IY; 28.06.2013
comment
Пойдем по этому пути. Должен ли запуск сеанса быть АБСОЛЮТНО первой строкой кода? Поскольку я настроил его сейчас, я вызываю его содержащий класс и генерирую локальный кулак значения $token (эта часть является внешним файлом). Может ли это быть проблемой? Однако я не сохраняю $token в $_SESSION ДО тех пор, пока session_start() не будет выполнено. Я удалил свой собственный метод и просто использовал session_start(). Возникает та же проблема. - person Mlagma; 28.06.2013