私が正しく理解していれば、このタスクにはキャプチャは必要ありません。ユーザーが自分のPCの前に座って自分をクリックしたかどうかを確認したいと思います。
新しい考え
フォームに複数の画像送信を配置します。
<input type="image" name="send1" src="buttons.php?i=1" />
...
<input type="image" name="send8" src="buttons.php?i=8" />
フォームを生成するときは、1から8までの乱数を取得し、に保存し$_SESSION['submitnumber']
ます。2つの同じサイズの画像を作成します。1つはフォームのデフォルトの背景で埋められた空で、もう1つは送信ボタンのように見えます。このコードで画像を出力するbuttons.phpを作成します。
header("Content-Type: image/jpeg");
flush();
readfile($filename);
$_GET[i]!=$_SESSION['submitnumber']
それ以外の場合は送信画像を返す場合は、空の画像を返します。
正しいimagesubmitがクリックされた場合は、フォームを受け入れます(ユーザーがボタンをクリックすると、ブラウザーはsend1Xのような座標を送信します)
これはキャプチャの一種ですが、人々は知りません;)
古い考え
あなたは2つのものが必要です:
1非常にユニークなフォームのトークンを生成します。
<input type="hidden" name="timertoken" value="someweirdstring" />
「someweirdstring」を配置して生成し、(ユーザー名と時間)に依存するもののmd5ハッシュにします。これについて詳しく説明することはできますが、これは安全性とCSRF攻撃をブロックするための基本的なフォームトークンです。トークンは投稿後に検証されます。
例:
これはトークンメカニズムの一般的な実装ではありませんが、十分です。
$token=generatesomerandomtext();
$_SESSION['token']=$token;
//... somewhere later when outputing forms:
echo '<input type="hidden" name="token" value="'.$token.'" />';
//and when it comes back:
if($_POST['token']==$_SESSION['token']) {
//it's ok
}
必要なのはそれだけです。この簡単な例では、ページごとに一意のトークンを作成し、フォームに入力します。時間に依存せず、md5を使用しませんが、トークンをセッションに保存します。受け入れられるフォームを自動的に送信するには、生成したフォームを使用するか、トークンをコピーする必要があります。
実際のフォームトークンの例は、次のようになります。$ token = md5($username。'some secrettext'。$date。$timeRoundedTo10Minutes);
//... somewhere later when outputing forms:
echo '<input type="hidden" name="token" value="'.$token.'" />';
//and when it comes back:
if(
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes)) ||
($_POST['token']==md5($username.'some secret text'.$date.$timeRoundedTo10Minutes-10minutes)) ) {
//it's ok
}
なぜユーザー名?あるユーザーのトークンを使用して別のユーザーをハッキングする可能性を排除するため、なぜ秘密のテキスト(「ソルト」と呼ばれる)なのか?誰かが他のユーザーの名前を時間とともにくっつけてmd5を実行する可能性があるためですが、塩を推測せずに実行することはできません。なぜ2つの比較ですか?現在が22:44:59の場合-トークンは22:40で生成され、ユーザーが送信した場合は22:45:30であるため、22:50に丸められ、10分戻した場合にのみトークンと一致します。 。
基本的な例は以上です。参考までに、この質問を参照してください。
2送信ボタンをに変更し<input type="image" ...
て、ボタンがクリックされた場所のx座標とy座標を投稿します。誰が仕様でこれを思いついたのかわかりませんが、初めて使用できます!:)
ここで、ユーザーが自分自身をクリックしたかどうかを確認します。座標が存在するかどうかを確認し(従来の送信では送信されません)、これを単純なハッキングをブロックする必要があります。プレーヤーのセッションの最後のxとyを覚えて比較することもできます。毎回異なる座標を送信するためにハッキングするのははるかに困難です。
フォームトークンは、ユーザーがクリック座標をシミュレートするランダムなフィールドを持つフォームのコピーを準備するのを防ぐためにあります。トークンが毎回変更される場合、フォームフィールドを上書きするのは困難です。
これはまだuserscript機能によってハッキング可能ですが、はるかに困難です。また、1時間に1回キャプチャを追加した場合、1時間だけ役立つスクリプトを作成し、その後は中断することはありません(そして、ある程度の努力と知識が必要です)。