У меня есть форма, и я хочу, чтобы она была как можно более безопасной. Поэтому у меня есть эта функция, которая генерирует токен формы.Хранение токена PHP в сеансе, но он постоянно менялся
function generateFormToken($form) {
// generate a token from an unique value
$token = hash('sha256', uniqid(microtime()));
// Write the generated token to the session variable to check it against the hidden field when the form is sent
$_SESSION[$form.'_token'] = (string)$token;
return $token;
}
Вот как он активируется:
if (empty($_POST)){
$newToken = generateFormToken('form1');
}
Вот функция, я использую, чтобы проверить это:
function verifyFormToken($form) {
// check if a session is started and a token is transmitted, if not return an error
if(!isset($_SESSION[$form.'_token'])) {
return false;
}
// check if the form is sent with token in it
if(!isset($_POST['token'])) {
return false;
}
// compare the tokens against each other if they are still the same
if ($_SESSION[$form.'_token'] !== $_POST['token']) {
return false;
}
return true;
}
Мой HTML форма имеет скрытый вход в который я поставил новая переменная токена. Форма отправляется на ту же страницу через form action="#"
.
Проблема в том, что по какой-то причине, когда обновление страницы, даже если функция не звонит снова, изменения токена в сеансе, но она остается неизменной в форме.
Я действительно потерялся, так как думал, что просят PHP хранить строку в сеансе, она не изменится, когда страница обновится в этих условиях, но она продолжает давать мне другой ответ. Я пытался позвонить die()
до того, как он войдет в функцию, чтобы убедиться, что функция не как-то снова загружается в скрипте, но ничего не происходит. Теоретически он не должен обновляться.
Помогите мне пожалуйста.
Вот HTML форма:
<form action="#" method="POST" id="form1">
<label for="firstname">Firstname</label>
<input type="text" name="firstname">
<input type="hidden"name="token" value="<?= $newToken; ?>">
</form>
А вот логика проверки, которую я использую в верхней части моей страницы:
$msg = "";
//If the form has been filled
if (!empty($_POST)){
//If the form has been sent from our website
if (verifyFormToken('form1') == true){
//TODO CAPTCHA
if (1 == 1){
//Everything's fine
}
else{
$msg = 'Veuillez cocher la case «Je ne suis pas un robot».';
}
}
//Else, user tried to send data with his own script (Possible XSS attack)
else{
$msg = 'Veuillez utiliser le formulaire directement sur notre site Web afin d\'appliquer sur l\'offre d\'emploi';
}
}
else{
//If form is not sent, we generate a new token and store it in the user's session
$newToken = generateFormToken('form1');
}
if (!empty($msg)){
echo $msg;
}
Вы уверены, что функция не работает снова? Вы пробовали 'print_r ($ _ POST)', чтобы убедиться, что он пуст. Попробуйте помещать выражение 'echo' внутри функции, чтобы увидеть, получает ли он каждое обновление. –
100% уверен ..., Я пробовал именно это, и он не ответил на что-то –
, ваш скрытый атрибут не содержит атрибут имени и убедитесь, что на вашем сервере включены короткие теги. –