在某些浏览器中,远程服务器上不需要更改PHP会话值

在某些浏览器中,远程服务器上不需要更改PHP会话值,php,session,token,csrf,Php,Session,Token,Csrf,不幸的是,由于我无法为我提出的问题找到合适的答案,我不得不再次提问。 我必须在我的web应用程序中防止CSRF攻击。因此,我在主文件index.php的顶部创建了一个令牌,如下所示: <?php session_start(); $_SESSION['token'] = md5(uniqid()); ?> 并将其放在表单的隐藏字段中,以将其发送到如下处理文件: <input type="hidden" name="token" value="<?php echo $

不幸的是,由于我无法为我提出的问题找到合适的答案,我不得不再次提问。
我必须在我的web应用程序中防止CSRF攻击。因此,我在主文件index.php的顶部创建了一个令牌,如下所示:

<?php
session_start();
$_SESSION['token'] = md5(uniqid());
?>

并将其放在表单的隐藏字段中,以将其发送到如下处理文件:

<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />

我希望它必须以同样的方式工作,当我上传到远程主机上的项目。但它在互联网上有一种奇怪的行为$\u POST['token']$\u SESSION['token']在web上不再相同$\u会话['token']处理文件中的更改,无任何代码

<?php
session_start();
echo $_SESSION['token'].'<br />'.$_POST['token'];
// Out put is like lines below:
// 22a0331a5ef07b96d95e2e0f6b98e282
// f859cc725cf7c7026aaaf84a48779199
?>

奇怪的是,这种未知的方式以前在IE中出现过,但现在它没有出现在IE中,而这次它发生在Chrome中。Firefox也没有这个问题

我不知道是怎么回事。没有人能帮我找到合适的答案。

请帮帮我…

您在创建和检查代币时遗漏了一大部分内容。这里的问题在于行
$\u SESSION['token']=md5(uniqid())。至少把它包装成这样

if ( isset ( $_SESSION['token'] ) ) {
    $_SESSION['token'] = md5(uniqid());
}

验证和使用后,您可以再次自由更改令牌。

我认为您的会话已重置,您能否准确发布您的代码?如果您认为正确,为什么它不会出现在所有浏览器中?您没有任何证据证明这一点?所以我们可以认为这是正确的,并且重新检查你的代码,也没有其他人报告同一个问题。你能提供相关的代码吗?亲爱的JasonOOO,一切都是我在这个问题中的代码。如果您想确保没有遗漏任何一点,我已经在中创建了一个简单的实例。在不同浏览器中尝试创建令牌会话只发生一次,位于index.php顶部。没有其他地方可以创建它是的,可能是这样,但您需要检查它是否存在或是否已被使用。否则,您将在每个请求中创建不同的令牌。
if ( isset ( $_SESSION['token'] ) ) {
    $_SESSION['token'] = md5(uniqid());
}