0

私はこの設定をしています:送信ボタンのあるHTMLフォーム->ボタンがjqueryで押されたかどうかを確認-> $.post(jquery)を介してphpページに入力を送信します。

誰かが実際に HTML フォームのボタンを押したかどうかを php コードで確認するにはどうすればよいですか? ユーザーがフォームを経由せずに $_POST 値を php ページに送信できないようにしたいと考えています。

4

2 に答える 2

1

私は次のことをします:

  1. 現在の日付/時刻に基づいてランダムにハッシュ化されたトークンを生成する形式で非表示の投稿値を持ちます。
  2. フォームが初めて送信されるときに、このトークンを保存します。(データベース)
  3. 誰かがフォームを送信しようとするたびに、ランダム トークンが更新され、タイムスタンプに基づいているため一意になります。したがって、ユーザーがフォームを介さずにトークンと POST データをコピーするだけでフォームを送信する場合、コードはそのトークンがデータベースに既に存在するかどうかを PHP 側で確認する必要があります。ユーザーに分かりやすいエラー メッセージまたはリダイレクトを表示する場合。そうでない場合は、古いトークンを更新して新しいトークンを保持します。

トークンは、何をしたいかによって、DB またはセッションのいずれかに保存できます。

于 2013-01-25T22:19:59.703 に答える
0

あなたは基本的にCSRFから守りたいと思っています。GGio が言ったように、セッションベースのトークンはこれを達成するための最良の方法です。

if (!isset($_SESSION['token'])) {
    $token = sha1(uniqid(rand(), true) . $_SESSION['user_id']);
    $_SESSION['token'] = $token;
    $_SESSION['token_time'] = time();
}
else{
    $token = $_SESSION['token'];
}

あなたのフォーム要素で:

<input type = "hidden" name = "token" value = "<?php echo $token; ?>" >

フォームを処理する前に:

if(isset($_SESSION['token']) && isset($_POST['token']) && $_POST['token'] === $_SESSION['token']){
    //user submitted the form correctly
}
else{
    //something isn't right
}
于 2013-01-25T22:21:42.290 に答える