データがフォームからのものであることを保証することはできません。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');
}
これは簡単な例です。同じハッシュなどを取得できるように、キーをアルファベット順に並べ替えることをお勧めします。これは、フォームでのテンパリングを防ぐために、リクエストごとに一意のトークンが必要なユーザーの概念を示しています。必要以上のデータを送信します。
ただし、これは、ユーザーが実際にフォームを使用してデータを送信したことを意味するものではありません。