我正在实施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();
。
答案 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;