为什么只有在用户首次访问网站时,会话值才会更改

时间:2019-06-28 15:12:01

标签: php html ajax

我想通过添加带有哈希令牌的隐藏输入字段并将其在服务器上与令牌设置为会话的会话进行比较,来为登录表单添加CSRF保护。由于某些奇怪的原因,当用户首次访问该页面时,SESSION值正在更改。刷新后,一切正常。

以下是代码的工作方式

  1. 首先,用户在登录表单上提交其数据,该表单看起来像 像这样

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

  1. 然后使用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);
    }
  });
});
  1. 之后,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

验证失败

仅当用户首次访问我的网站时发生,第一次刷新后,一切正常。

有人可以解释一下为什么会发生这种情况吗,我怎么能通过呢?一种选择是仅在令牌检查失败时刷新页面,但这仍然困扰着我,因为这根本不应该发生。

我还尝试在两个文件都包含在开头的根文件中添加会话设置。

0 个答案:

没有答案