8

私はゲーム Web サイトを運営しているため、多くのユーザーがログインしており、2 分に 1 回特定の操作を行うことができます。

私はいくつかの場所でCAPTCHAシステムを使用していますが、常にコードを要求するものもあれば、10分ごとに要求するものもあります.

何人かのプレイヤーに Opera の自動送信機能を使用してもらいましたが、私の CAPTCHA システムはそれらを停止します。

私の質問は、コードを要求する回数を最小限に抑えながら、この自動送信を使用する人を止めるにはどうすればよいですか?

4

2 に答える 2

6

私が正しく理解していれば、このタスクにはキャプチャは必要ありません。ユーザーが自分の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時間だけ役立つスクリプトを作成し、その後は中断することはありません(そして、ある程度の努力と知識が必要です)。

于 2010-04-19T17:49:36.100 に答える
3

受信したデータに応じて、発信者がユーザーであるという証拠を収集できます。発信者がボットであると思われる場合にのみ、CAPTCHA を要求してください。

証拠は次のとおりです。

  • ユーザーエージェント (オペラはこれを偽造できるため、信頼できません)
  • 送信がトリガーされる間隔 (コールが 2 分ごとに正確にヒットするほど、ボットである可能性が高くなります)
  • データで返されるパターンをチェックできる場合は、それも明らかです。
  • ...
于 2010-04-08T13:08:09.510 に答える