openssl + random int для токена, проблемы, когда дело доходит до действия формы

У меня есть функция токенов, как это:

public static function create() {
$int = random_int(8, 64);
$ssl = openssl_random_pseudo_bytes(32);
$base64 = base64_encode($ssl);
return Session::put(Config::get('session/token_name'), trim($base64, '='));
}

Моя функция токенов работает, проблема возникает, когда я попробовал ее сейчас на нескольких forms Примечание: та же страница

Это моя форма (например, я только изменил имена, но это в моем коде):

<form method="post">
<input type="hidden" name="t_sample1" value="<?php echo Token::make(); ?>">
<button name="btn1">sample1</button>
</form>
<form method="post">
<input type="hidden" name="t_sample2" value="<?php echo Token::make(); ?>">
<button name="btn2">sample2</button>
</form>
<form method="post">
<input type="hidden" name="t_sample3" value="<?php echo Token::make(); ?>">
<button name="btn3">sample3</button>
</form>
<form method="post">
<input type="hidden" name="t_sample4" value="<?php echo Token::make(); ?>">
<button name="btn4">sample4</button>
</form>

Затем я пробую этот стиль токенов, потому что я изменил свою функцию токенов с md5(uniqid()) стиль, потому что они сказали, что это не безопасно, и я прочитал много советов экспертов и сказал пойти openssl затем base64_encode Это. Это php код для определения, если какая форма нажата.

if(Input::exists()) {
if(Token::check(Input::get('t_sample1'))) {
$echo = 'sample1';
}
if(Token::check(Input::get('t_sample2'))) {
$echo = 'sample2';
}
if(Token::check(Input::get('t_sample3'))) {
$echo = 'sample3';
}
if(Token::check(Input::get('t_sample4'))) {
$echo = 'sample4';
}

}

Теперь проблема в том, когда я пытаюсь нажать на кнопку sample1-sample3 мой token::check ложно, но только sample4 делает token::check иди правда. Кажется, что только последний form будет иметь только правильный token, Поэтому я ищу помощь, как выяснить, как заставить другой образец (1-3) стать правдой под token::checkКстати md5(uniqid()) Функция токенов работает.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …