我可能会以错误的方式解决这个问题。我有一个收集信息的PHP表单。提交后,它会显示验证信息。然后当您提交表单时,它会发送到另一个PHP脚本进行处理。
我想添加一个从表单传递到验证表单的令牌/密钥,以确保它们仍在我的站点上,然后从验证表单到最终的PHP脚本进行处理。
这看起来像答案:How do I provide more security for checking source of the request
但我无法让它发挥作用,而且我没有足够的声誉来发表评论。因此,出于纯粹的挫折感,我在这里发帖与我的问题重复。
答案是以形式使用它:
<?php
session_start();
$csrfToken = md5(uniqid(mt_rand(),true)); // Token generation updated, as suggested by The Rook. Thanks!
$_SESSION['csrfToken'] = $token;
?>
<form action="formHandler.php">
<input type="hidden" name="csrfKey" value="<?php echo $csrfToken ?>" />
</form>
表单处理程序中的这个:
<?php
session_start();
if($_POST['csrfKey'] != $_SESSION['csrfKey']) {
die("Unauthorized source!");
}
?>
它不起作用。我的问题不应该是$_SESSION['csrfToken'] = $token;
$_SESSION['csrfToken'] = $csfrToken;
且不应if($_POST['csrfKey'] != $_SESSION['csrfKey'])
为if($_POST['csrfKey'] != $_SESSION['csrfToken'])
虽然我已经尝试过,但它也不起作用。
我完全失去了。
答案 0 :(得分:1)
清理错别字和名称混合,应该这样工作:
<?php
session_start();
$csrfToken = md5(uniqid(mt_rand(),true));
$_SESSION['csrfToken'] = $csrfToken;
?>
<form action="formHandler.php">
<input type="hidden" name="csrfToken" value="<?php echo $csrfToken?>" />
</form>
而不是在验证提交的数据时:
<?php
session_start();
if($_POST['csrfToken'] != $_SESSION['csrfToken']) {
die("Unauthorized source!");
}
?>