非常简单的设置:当页面加载时,会生成随机会话令牌并保存在$ _SESSION [“token”]中。表单在隐藏的输入字段中包含此标记。在此之前没有问题。我将表单提交到同一页面(action =“”),然后我尝试检查$ _SESSION [“token”]是否等于通过POST发送的令牌。变量相应地改变,然后我生成一个新的会话令牌,在页面再次加载之前替换旧的$ _SESSION [“token”]。
问题:$ _SESSION [“token”]在调用页面时再次更改(在我可以比较SESSION和POST令牌之前)因此,两个令牌永远不会匹配。我无法弄清楚为什么会改变。这不是我写的代码行,因为它们也会被执行,在页面加载之前再次替换未知来源的随机令牌。
INDEX:
<?php
session_start();
date_default_timezone_set("Europe/Berlin");
$BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
$form_valid = false;
if (isset($_POST["token"]) && isset($_SESSION["token"])) {
if ($_POST["token"] == $_SESSION["token"]) {
$form_valid = true;
}
}
//Set (new) session token
$token = bin2hex(random_bytes(10));
$_SESSION["token"] = $token;
//Load actual page
include ("/backend/admin.php");
?>
包含页面:
<?php echo "FORM VALID:"; var_dump($form_valid); ?>
<?php if (!isset($_SESSION["admin"]) || !$_SESSION["admin"]) { ?>
<form id="verify" method="POST" action="">
<label>Password</label>
<input type="password" name="access">
<input type="hidden" name="token" value="<?= $_SESSION['token'] ?>">
<input type="submit" value="Senden">
</form>
<?php } else { ?>
...
<?php } ?>
任何帮助表示赞赏。谢谢。
答案 0 :(得分:0)
您的逻辑存在问题,每次会话令牌更新,无论表单是否提交,
$token = bin2hex(random_bytes(10));
$_SESSION["token"] = $token
试试这个,
<?php
session_start();
date_default_timezone_set("Europe/Berlin");
$BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
$form_valid = false;
if(empty($_SESSION["token"] )){
$_SESSION["token"]= bin2hex(random_bytes(10));
}
if (isset($_POST["token"]) && isset($_SESSION["token"]))
{
if ($_POST["token"] == $_SESSION["token"]) {
$form_valid = true;
unset($_SESSION["token"]);
}
}
include ("/backend/admin.php");
?>