1

フォームを自分自身に送信する 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 の投稿があるかどうかのみをチェックしています。おかげで今はうまくいきます。

4

3 に答える 3

0

ページを開くと $auth が生成され、サブミット後に隠しフィールドになります.

于 2012-11-29T18:44:58.447 に答える
0

常に新しいものを生成している$secretため、常に異なります。が存在するかどうかを確認し、$_SESSION['secret']存在しない場合は新しい変数を作成できます。何かのようなもの:

if(!isset($_SESSION["secret"])){
    $secret = substr(md5(uniqid(rand(), true)), 1, 2);
    $_SESSION["secret"] = $secret;
    $auth = $secret;
}
于 2012-11-29T18:45:38.280 に答える
0

コードの実行をデバッグする時点で、シークレットが変更されています。

echo $_POST["id"]; // previous secret
echo "=";
echo $_SESSION["secret"]; // new secret

スクリプトの最初 (次のシークレットを生成する前)で一致のチェックを行う限り、問題ありません。

于 2012-11-29T18:46:04.793 に答える