0
非常簡單的設置:加載頁面時,生成一個隨機會話令牌並保存在$ _SESSION [「token」]中。表單在隱藏的輸入字段中包含此標記。在這之前沒有問題。我將表單提交到同一頁面(action =「」),然後嘗試檢查$ _SESSION [「token」]是否等於通過POST發送的令牌。一個變量會相應地改變,然後我再次生成一個新的會話標記,替換舊的$ _SESSION [「標記」]。PHP會話變量無法生存
問題是:在$ _SESSION [「令牌」]再次改變的時刻調用頁面(以前我可以比較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 } ?>
任何幫助表示讚賞。謝謝。
好了,所以我想這和它的工作 - 某種方式。說這是因爲雖然它確實解決了問題,但它使用戶無法輸入錯誤的密碼,然後再次嘗試。因爲不管密碼是什麼,令牌都會被取消設置,我將不得不重新加載以獲取新的令牌。 在上面的例子中,我切斷了我實際檢查密碼的部分,對不起。 [1/2] – Hylaze
然而,我仍然不明白爲什麼我的邏輯是有缺陷的。每次加載頁面時獲取新的令牌應該是絕對沒問題的,只要新的令牌在現有的令牌被比較之後設置即可。這正是我所做的,不是嗎? 當它只是一個頁面重新加載 - >誰在乎?沒有令牌比較,你得到一個新的。我看不出這有什麼缺陷。 但如果是,請賜教:/ [2/2] – Hylaze
問題是 $ _ POST [ 「令牌」] - >老的道理, $ _SESSION [ 「令牌」] - >新的令牌, ,因爲一旦用戶點擊提交,頁面將被刷新,並且SESSION會再次更新,留下POST有舊標記。希望這可以幫助 –