通过$ _SESSION和$ _POST传递令牌 - if语句问题?

时间:2014-09-22 22:44:02

标签: php forms session csrf

我正在实施CSRF保护并且非常困难。所以我生成一个令牌并将其存储在$_SESSION['token']中。现在我将需要这个令牌在另一个页面上进行比较,所以在另一个页面上我这样做:

session_start();
$token = "";
$token = $_SESSION['token'];
echo $token;

unset($_SESSION['token']);
echo "<br />";

$compToken = "";
$compToken = $_POST['token'];
echo $compToken;

PHP要求我将变量设置为某个值,否则它是无效的。以下是输出:

41852450b2fbeed352d895d8ee57dfc9
41852450b2fbeed352d895d8ee57dfc9

如您所见,它们匹配令牌。现在,当我进入if语句来比较我刚从表单中抓取的内容之前,我将继续处理:

if($compToken === $token) {
    return true;
} else {
    echo "Token error.";
    return false;
}

它不起作用,也没有报告任何错误。我甚至试过if($_SESSION['token'] === $_POST['token']),这应该可以工作,因为两个变量都成功传递并存储(如前面的代码所示)。

if statement发生了什么?

编辑:

session_start();
$token = md5(uniqid(mt_rand(), true));
$_SESSION["token"] = $token;

好的,下面的部分很乱 - 用于调试目的。遗憾!

session_start();
$token = "";
$token = $_SESSION['token'];
$token = trim($token);
echo $token;
unset($_SESSION['token']);
echo "<br />";
$compToken = "";
$compToken = $_POST['token'];
$compToken = trim($compToken);
echo $compToken;
echo "<br />";
echo"1";
if($compToken == $token) {
    return true;
} else {
    echo "Token error.";
    return false;
}
echo "2";

EDIT2:

对于那些将来阅读此内容的人来说,似乎问题是对原始edit中的if语句返回true。我不确定为什么 - 但将其改为echo "true";似乎也有效。如果它们彼此不相等,我会将if statement调整为return false; and die();

1 个答案:

答案 0 :(得分:1)

我刚试过,你确定你的形式是这样的:

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

这是我的代码:
form.php的

<?php
session_start();
$_SESSION['token'] = 'abc123abc123';

?>

<form action="index.php" method="post">
    <input type="hidden" name="token" value="abc123abc123" />
    <input type="submit" value="Submit">
</form>

这是表单发布到的地方:
的index.php

<?php

session_start();
$token = $_SESSION['token'];

$compToken = $_POST['token'];

if($compToken === $token) {
    echo 'True';
} else {
    echo "Token error.";
}

它回应了真实的&#39;