簡単な設定:ページが読み込まれると、ランダムセッショントークンが生成され、$ _SESSION ["token"]に保存されます。フォームには、非表示の入力フィールドにこのトークンが含まれています。この時点まで問題はありません。非常に同じページ(action = "")にフォームを送信し、$ _SESSION ["token"]がPOST経由で送信されたトークンと等しいかどうかを確認しようとします。それに応じて変数が変更され、ページが再びロードされる前に古い$ _SESSION ["token"]を置き換える新しいセッショントークンが生成されます。PHPセッション変数が残っていません
問題はです:セッションが呼び出された瞬間に$ _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 } ?>
任意のヘルプは高く評価されます。ありがとうございました。
、これを試してみてくださいので、私はこれとそれを試してみました働いた。それは問題を解決している間に、間違ったパスワードを入力してからもう一度やり直すことができないためです。パスワードが何であっても、トークンは設定されていないので、新しいトークンを取得するには再度読み直す必要があります。 ああ、上記の例では、実際に正しいパスワードを確認する部分を切りました。申し訳ありません。 [1/2] – Hylaze
しかし、なぜ私の論理に欠陥があるのか分かりません。既存のトークンが比較された後に新しいトークンが設定されているかぎり、ページを読み込むたびに新しいトークンを取得することは大丈夫です。それはまさに私がやっていることですね。 それはちょうどページリロード - >誰が気に?トークンは比較されず、新しいトークンを取得します。これはどこに欠陥があるのかわかりません。 しかし、それであれば、私を啓発してください:/ [2/2] – Hylaze
問題が $ _POST [ "トークン"]だった - >古いトークン、 $ _SESSION [ "トークン"] - >新しいトークン、 ユーザーがサブミットするとすぐにページがリフレッシュされ、SESSIONが再び更新され、POSTに古いトークンが残るためです。これが役に立ちますようにお願いします。 –