フォームを自分自身に送信する php ページがあります。
基本的なクロスサイト フォージェリを阻止できるチェックを追加したかったのです。
私のコード:
<?php
session_start();
(...) //some code
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
?>
(...)
<form id="form" name="form" action="<?php echo htmlentities($_SERVER[PHP_SELF]); ?>" method="post">
(...)
<input type="hidden" name="id" value="<? echo $auth; ?>" />
(...)
<?php
(...)
//as a debug I just tried to display
echo $_POST["id"];
echo "=";
echo $_SESSION["secret"];
(...)
?>
<div>
</body>
</html>
ただし、 と の両方が同じ値を返すことはid
ありません。
何故ですか?私は何が欠けていますか? secret
アップデート
それで、ジョン・スターリングのコメントでも示唆されているように、ここでサミュエル・クックによる答えを試しました:
if(!isset($_SESSION["secret"])){
$secret = substr(md5(uniqid(rand(), true)), 1, 2);
$_SESSION["secret"] = $secret;
$auth = $secret;
}
$_SESSION["secret"]
しかし今、ページが返されない場合:
<input type="hidden" name="id" value="" />
セッション変数が存在する場合にのみシークレットが設定されるため、その理由を理解しています。
助言がありますか?
アップデート
新しいセッション キーを生成する前にチェックを移動し、id の投稿があるかどうかのみをチェックしています。おかげで今はうまくいきます。