2012-03-07 7 views
3

は、私が試してみました:PHPで重複したフォーム提出を防ぐにはどうすればいいですか?

  • POST/REDIRECT/GETメソッドが、これは、同じフォームの複数のインスタンスを防ぐことはできません(例えば、ユーザは、2つの別々のウィンドウでform.php開き、提出した場合フォームはロードされ、確認され、フォームが処理されるときにセッション変数にUIDが生成されますが、UIDはフォームが処理されるときにUIDが生成されるUNIQUE TOKENメソッドです。ユーザーは他の異なるフォームを開いているので、変数はこれらの他のフォームからも設定されていないので、 'already processed'として扱われます。

+2

したがって、フォームごとに固有のトークンセッションがあります。 –

+2

フォームを複数回使用している場合(特にブラウザが異なる場合)は、これを防ぐことはできません。とにかく彼らは何度も開いた形になっていますか?クリックした後に送信ボタンを無効にするだけで、間違って2回送信することはできません。 – toby

+0

私はこれをやろうとしましたが、ユーザーが別のフォームを開いたときにセッションに新しいトークンが割り当てられ、以前のフォームが無効になる場合があります。 –

答えて

0

フォーム送信はログインしているユーザーまたはサイト訪問者に限定されていますか?

このフォームがログインユーザー専用の場合は、フォームがコントローラに到達するとすぐにuser_idを確認できます。フォーム処理中に一時的なクッキーまたはセッション変数を設定することができます。フォームが完了すると、このセッション変数の設定を解除できます。フォームが送信されるとすぐに、このセッション変数が既に設定されているかどうか(フォームを2回送信したかどうか)を確認します。このセッション変数が検出された場合は、要求に失敗します。

サイト訪問者と同じことをすることもできますし、IPアドレスを格納するテーブルを使用することもできますが、これは過度のリソース消費があります。

0

単一の送信のみを希望するフォームを特定します。次に、フォームhtmlを生成してセッションに保存するたびに、独自のトークンを隠しIDとして追加します。これは、未処理のグループの一部であるすべての有効なIDを知っていたことです。 1つのサブミッションだけがそのグループの他のすべてのIDをキャンセルします。それは彼がその後いくつかの他のフォームを開くと、新しいグループの作成を開始することを意味します。

このオープンでは、未処理のフォームに属するすべてのIDの項目を持つセッション配列(またはdb)が必要です。一度に1つのグループのみが残ることができます。グループに属していないIDは無視/キャンセルされます。

1

ユーザー "Ofir Baruch"からのコメントを見ましたか?それは私にとって正しいようです。

あなたが既に試した2つのアプローチを組み合わせて、正しく行い、Ofir baruchが述べたように、各フォームに対して一意のトークンセッションを持つだけです。 form2.php

form1.php

session_start(); 

if (empty($_SESSION['form_tokens']['form1'])) 
{ 
    $_SESSION['form_tokens']['form1'] = generate_random_token(); 
} 

if (isset($_POST['token'])) 
{ 
    if ($_POST['token']) != $_SESSION['form_tokens']['form1']) 
    { 
     // the token is invalid - do not process the form 
     redirect('/some_page'); 
    } 
    else 
    { 
     // process the form here 
     if ($success) 
     { 
      // reset the token for this form 
      unset($_SESSION['form_tokens']['form1']); 
      redirect('/another_page'); 
     } 
    } 
} 

<form id="form1"> 
    <input type="hidden" name="token" value="<?php echo $_SESSION['form_tokens']['form1']; ?>" /> 
    <input type="submit" value="Submit" /> 
</form> 

あなたが同じことをするだろうが、代わりに独自のトークンを使用して:このような

多かれ少なかれ

$_SESSION['form_tokens']['form2'] 

2つの異なるブラウザ(またはコンピュータ)を使用してALSOを防止したい場合、これはimpですあなたが別の場所でそれに対処する必要があります - つまり、同じユーザーが2つのセッションを持つことを許可すべきではありません。これを達成するにはいくつかの方法がありますが、もう一つの質問です。

関連する問題