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

时间:2014-04-03 17:38:37

标签: php session token csrf

不幸的是因为我找不到问题in this post的正确答案,我不得不再问一遍。
我必须在我的Web应用程序中阻止CSRF攻击。所以我在主文件 index.php 的顶部创建了一个令牌,如下所示:

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

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

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

当我在本地处理文件中运行代码时,一切正常, $ _ POST ['token'] $ _ SESSION ['token'] 都相同彼此相同。我确信运行下面的代码:

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

我预计在远程主机上传项目时必须以相同的方式工作。但它在互联网上有一种奇怪的行为。 $ _ POST ['token'] $ _ SESSION ['token'] 在网络上不再相同。 $ _ SESSION ['token'] 处理文件中的更改没有任何重新创建代码!

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

陌生人的观点是,这种未知的方式之前是在IE中,但现在它不会发生在IE中,这次它发生在Chrome中。 Firefox也没有这个问题。

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

1 个答案:

答案 0 :(得分:2)

您在创建和检查令牌方面错失了很大的一部分。这里的问题在于$_SESSION['token'] = md5(uniqid());行。至少把它包装成这样的东西,

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

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