我尝试在登录表单中引入令牌以防止CSRF,因为我查看了一些帖子here,据说它是推荐的。我在记录区域内发送令牌的方式是通过标头。 (我就是这样做的。)
登录表单是"一如既往":
的login.php
<?php
session_start();
$_SESSION['csrf_token'] = 'the_token_string';
header('X-CSRF-Token: '.$_SESSION['csrf_token']);//I'm not sure if is really neccessary to set this header here).
?>
<html>
<form method="post" action="flogin.php">
<input type="text" name="user"/>
<input type="password" name="pass"/>
<input type="hidden" name="token" value="<?php echo $_SESSION['csrf_token'] ?>"/>
<input type="submit"/>
</form>
</html>
在接收数据的文件中,我检查用户名,密码和令牌的一切都很好。如果用户成功登录,我只需将他/她重定向到主页面。我们来调用main.php
flogin.php
//irrelevant code. Everything is fine.
$_SESSION['logged'] = true;
header('Location: main.php');
exit;
现在,在main.php中,我要做的第一件事(它是必须的)是检查用户是否真的被记录并检查令牌。
main.php
<?php
session_start();
if(!isset($_SESSION['logged'] || !$_SESSION['logged'])){
header('Location: logout.php');
exit;
}
$headers = apache_request_headers();
if(!isset($_SESSION['csrf_token']) || !isset($headers['X-CSRF-Token']) || $headers['X-CSRF-Token']!=$_SESSION['csrf_token']){
header('Location: logout.php');
exit;
}
...
?>
这就是我遇到问题的地方。由于flogin.php文件中的标题(&#39;位置:main.php&#39;)在任何输出之前,它会直接重定向到main.php,而第一件事就是我&#39除了其他事情之外,还要做的就是用令牌检查标题我总是遇到标题尚未设置的问题。
我不知道如何将带有令牌值的标头发送到main.php。我非常坚持这个问题,我甚至都不知道这是不是正确的方法。
我搜索了这个,但我发现的一切都是关于卷曲的,我根本不使用卷曲(除非这是必须的)。
(我为代码错误道歉,如果有的话。我在原始时写过它。)
非常感谢您的时间。