ユーザー "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つのセッションを持つことを許可すべきではありません。これを達成するにはいくつかの方法がありますが、もう一つの質問です。
したがって、フォームごとに固有のトークンセッションがあります。 –
フォームを複数回使用している場合(特にブラウザが異なる場合)は、これを防ぐことはできません。とにかく彼らは何度も開いた形になっていますか?クリックした後に送信ボタンを無効にするだけで、間違って2回送信することはできません。 – toby
私はこれをやろうとしましたが、ユーザーが別のフォームを開いたときにセッションに新しいトークンが割り当てられ、以前のフォームが無効になる場合があります。 –