我想通过添加带有哈希令牌的隐藏输入字段并将其在服务器上与令牌设置为会话的会话进行比较,来为登录表单添加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
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
if(isset($_POST['login'])){
if($_SESSION['token'] === $_POST['token']){
//validate rest of the form
}else{
//do nothing
}
}
出于某些奇怪的原因,现在$ _SESSION ['token']值
098765431
验证失败
仅当用户首次访问我的网站时发生,第一次刷新后,一切正常。
有人可以解释一下为什么会发生这种情况吗,我怎么能通过呢?一种选择是仅在令牌检查失败时刷新页面,但这仍然困扰着我,因为这根本不应该发生。
我还尝试在两个文件都包含在开头的根文件中添加会话设置。