【发布时间】:2017-09-22 23:54:15
【问题描述】:
非常简单的设置:当页面加载时,会生成一个随机会话令牌并保存在 $_SESSION["token"] 中。表单在隐藏的输入字段中包含此标记。到目前为止没有问题。我将表单提交到同一个页面(action=""),然后尝试检查 $_SESSION["token"] 是否等于通过 POST 发送的令牌。相应地更改了一个变量,然后我生成一个新的会话令牌,在页面再次加载之前替换旧的 $_SESSION["token"]。
问题是:在调用页面的那一刻,$_SESSION["token"] 再次更改(在我可以比较 SESSION 和 POST 令牌之前)因此,两个令牌永远不会匹配。而且我无法弄清楚它为什么会改变。这不是我写的代码行,因为这些代码也被执行了,在页面加载之前再次替换了未知来源的随机标记。
索引:
<?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 } ?>
感谢任何帮助。谢谢。
【问题讨论】: