非常简单的设置:当页面加载时,会生成一个随机会话令牌并保存在$ _SESSION [“token”]中 . 表单在隐藏的输入字段中包含此标记 . 在此之前没有问题 . 我将表单提交到同一页面(action =“”),然后我尝试检查$ _SESSION [“token”]是否等于通过POST发送的令牌 . 变量相应地更改,然后我生成一个新的会话令牌,在页面再次加载之前替换旧的$ _SESSION [“token”] .
Problem is :$ _SESSION ["token"]在页面调用时再次更改(在我可以比较SESSION和POST令牌之前)因此,两个令牌永远不会匹配 . 我可以't figure out WHY it changes. It'不是我编写的代码行,因为这些代码也被执行,在页面加载之前再次替换未知来源的随机令牌 .
指数:
<?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 } ?>
任何帮助表示赞赏 . 谢谢 .
1 回答
您的逻辑中存在问题,每次会话令牌更新,无论表单是否提交,都没有,
Try this,