Я хотел добавить защиту CSRF в мою форму входа в систему, добавив скрытое поле ввода с хешированным токеном и сравнив его на сервере с сеансом, для которого был установлен токен. По какой-то странной причине значение SESSION меняется, когда пользователь впервые заходит на страницу. После обновления все работает просто отлично.
Вот краткий обзор того, как работает код
- Сначала пользователь отправляет свои данные в форму входа, которая выглядит
как это
login.php
//PHP
$_SESSION['token'] = md5(uniqid());
//HTML
<form id="login">
<input type="text" name="username">
<input type="password" name="password">
<input type="hidden" name="token" value="<?=$_SESSION['token']?>">
<input type="submit">
<form>
Скажем, теперь значение токена
1234567890
- Затем данные формы отправляются на сервер с использованием jquery и ajax
login.js
$('#login').on('submit', function(e){
e.preventDefault();
$.ajax({
'type': 'POST',
'url': 'server.php',
'dataType': 'json',
'data': $('#login').serialize() + '&login=true',
success: function(response){
console.log(response);
},error: function(response){
console.log(response);
}
});
});
- После этого server.php получает значения POST и начинает проверять форму (вот где все смешно)
server.php
if(isset($_POST['login'])){
if($_SESSION['token'] === $_POST['token']){
//validate rest of the form
}else{
//do nothing
}
}
По какой-то странной причине значение $ _SESSION ['token'] теперь
098765431
А проверка не пройдена
Это происходит только тогда, когда пользователь посещает мой сайт в первый раз, после первого обновления все работает просто отлично.
Может ли кто-нибудь объяснить мне, почему это может происходить и как я могу пройти это? Одним из вариантов было бы просто обновить страницу, когда проверка токена не удалась, но это все еще беспокоит меня, потому что это не должно происходить вообще.
Я также попытался добавить настройки сеанса в корневой файл, который оба файла включают в начале.