Сбой переменной сеанса, проблема php - PullRequest
1 голос
/ 18 октября 2011
session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;

Так я запускаю свой код.

Затем я передаю переменную токена $ taht в скрытое поле в форме:

<input type="hidden" name="token" value="<?php echo $token; ?>" />

, но этоникогда не соответствует действительности:

if($_POST['token'] == $_SESSION['token'])
{       
        echo 'Session was valid<br/>';
}

почему?

Ответы [ 5 ]

3 голосов
/ 18 октября 2011

Потому что вы регенерируете свой токен ПЕРЕД проверкой.Вы должны изменить его ПОСЛЕ ТОГО, КАК вы уверены, что это не то же самое

2 голосов
/ 18 октября 2011

При отправке страницы новому сеансу будет присвоено новое значение.

Попробуйте,

session_start();
if(!isset($_SESSION['token']))
{
 $token = md5(uniqid(rand(), TRUE));
 $_SESSION['token'] = $token;
}
1 голос
/ 18 октября 2011

Попробуйте ввести $_SESSION['token'] в форму вместо $token, если вы случайно переназначили его между созданием токена и выводом формы.

Однажды у меня была проблема, очень похожая на эту, когда я разрабатывал что-то, на что у меня ушло много лет, и оказалось, что это потому, что я оставил <img src=''>, потому что у меня еще не было изображения - это привело к повторному запросу страницы, поскольку пустое значение src означает «эта страница», поэтому маркер был заново сгенерирован после загрузки страницы.

Еще одна вещь, которую нужно проверить, - это если атрибут action формы отсутствует или какое-либо значение, указывающее на себя, токен может быть регенерирован при отправке формы, перед оператором if (...).

0 голосов
/ 18 октября 2011

Код, который вы предоставляете, находится в одном файле, и вы отправляете его себе. которые восстанавливают токен и присваивают переменной сеанса. Как говорит «AVD», это код для предотвращения переназначения

session_start();
if(empty($_SESSION['token'])){
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}

тогда вы можете сравнить ваше состояние, где вы собираетесь проверить.

0 голосов
/ 18 октября 2011

Вы можете сделать что-то подобное, чтобы предотвратить сброс токена при каждой загрузке страницы:

session_start();
if (!isset($_SESSION['token']))
{
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}

Но ... вам может быть лучше session.referer_check или использоватьнекоторый класс Session с открытым исходным кодом, который включает в себя более детальную безопасность, чем использование этого в дополнение к процедурному стандарту.(если все сделано правильно, ваш код не должен будет изменяться везде, где вы фактически используете сеанс.) Для получения дополнительной информации см. php.net / session_set_save_handler .

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