8

$_POST私のコードが受信したデータが外部の影響ではなく、私のフォームからのものであることを確認する方法はありますか? $_POST基本的に、アカウント作成など、誰でも利用できるページになりすますことができるようにしたくありません。アカウント作成ページにはどのユーザーもアクセスできますが、account_creation フォームから送信されたデータのみが処理されるようにしたいと考えています。

私が考えることができた唯一のことは、を開始$_SESSIONし、非表示の入力を使用してフォームに session_id を提供することでした。$_POST 時に、非表示の入力の値が現在の session_id と照合されます。

この結果を達成するためのより良い方法がある場合は? もしあれば、楽しみに待っています。

4

6 に答える 6

8

データがフォームからのものであることを保証することはできません。POSTリクエストは単なるPOSTリクエストであり、さまざまな方法で生成できます。HTMLフォームは、非常にユーザーフレンドリーな方法の1つにすぎません。サーバーは、POSTリクエストを介して受信したデータが有効かどうか、およびそれに基づいて動作するかどうかを検証する必要があります。

そうは言っても、送信されるデータを制限および検証するのに役立つことがあります。まず、ユーザーが(セッション)Cookieを使用してログインしていることを要求します。これにより、匿名ユーザーによるランダムなリクエストが排除されます。次に、トークンを非表示フィールドとしてフォームに埋め込み、ユーザーのセッションに保存することもできます。POSTリクエストを有効にするには、そのトークンが含まれている必要があります。トークンは単なる疑似ランダム文字列です。
これは、ユーザーが送信することを期待するフォームフィールドのハッシュを準備することで強化できます。フォームの値を読み取り専用にする必要がある場合は、その値をハッシュに含めることもできます。例えば:

$rand = md5(mt_rand());
$hash = sha1('lastname:firstname:email:' . $rand);

$_SESSION['rand'] = $rand;
$_SESSION['hash'] = $hash;

// on form submit:

$keys = array_keys($_POST);
$checkHash = sha1(join(':', $keys) . ':' . $_SESSION['rand']);
if ($checkHash != $_SESSION['hash']) {
    die('Form submission failed token validation');
}

これは簡単な例です。同じハッシュなどを取得できるように、キーをアルファベット順に並べ替えることをお勧めします。これは、フォームでのテンパリングを防ぐために、リクエストごとに一意のトークンが必要なユーザーの概念を示しています。必要以上のデータを送信します。

ただし、これは、ユーザーが実際にフォームを使用してデータを送信したことを意味するものではありません。

于 2012-05-10T04:00:49.110 に答える
1

もう少し良いのは、user_agent、user_ip、その他の$_SERVER変数などの検証を追加することです。これらは私が使用する2つです。

したがって、説明するとおりに一意のID(またはセッションID)を作成しますが、エージェントとIPも一致することを確認するための検証を少し追加します。絶対確実ではありませんが、セキュリティのもう1つの小さな層を追加します。

編集:ユーザーエージェントを送り返さないことを付け加えておきます。そのサーバー側を維持し、返されたセッションIDに対してサイレントに検証します。

また、送信が検証に失敗した場合は、その理由をユーザーに決して明らかにしないでください。そうすれば、チートはそれらを追跡する方法を知りません。「5人の無効者とあなたは外出中」の追跡を追加することもできますが、そのためにはログインの種類が必要です。

于 2012-05-10T03:59:22.753 に答える
1

セッションIDを使用することは、確かにそれを行う1つの方法です。ただし、他のオプションもありますが、そのほとんど(すべてではないにしても)には、一部のデータを非表示フィールドとして追加することが含まれます。

  1. CAPCHAを使用します。これは常に各ページの読み込みに固有であるため、フォームの使用が必須になります。
  2. ランダムデータを生成してDB(または$_SESSION変数のみ)に保存し、フォームが送信されたら確認します。

オプション1は、2つの役割を担うため、ユーザー作成フォームに推奨するものです。$_POSTデータが独自のフォームからのものであることを確認しながら、独自のフォームの自動送信を停止します。

于 2012-05-10T03:59:38.447 に答える
0

これは XSRF を防止するための標準的なパターン パターンです。本質的には、あなたが言及したものと似ています。フォームがユーザーにレンダリングされると、サーバーはランダムなトークンを作成します。これは、ユーザーのブラウザー Cookie に関連付けられています。フォームの送信時に、サーバーにポストバックされます。次に、サーバーはトークンを発行されたものと比較し、一致が成功した後にのみフォーム アクションが実行されます。

于 2012-05-10T04:04:08.467 に答える
0

フォームに一意の値を入れて、サーバー側のセッションで格納された値と一致させることについて、多くの良い言及があります。それを行いますが、ユーザーが [戻る] ボタンを使用してフォームを 2 回送信しようとした場合、2 番目のブラウザー ウィンドウ (同じセッション!) を開いた場合、またはサイトで複数のフォームを使用した場合に何が起こるかについても考えてください。

システムを熟考せずにクレイジーなバグを作成しないでください。

于 2012-05-10T04:43:22.130 に答える