如何发送自定义标头以及标头位置?

时间:2015-12-15 03:29:05

标签: php login header token

我尝试在登录表单中引入令牌以防止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。我非常坚持这个问题,我甚至都不知道这是不是正确的方法。

我搜索了这个,但我发现的一切都是关于卷曲的,我根本不使用卷曲(除非这是必须的)。

(我为代码错误道歉,如果有的话。我在原始时写过它。)

非常感谢您的时间。

0 个答案:

没有答案