0

これは、私が設定したばかげたキャプチャ システムに関連する状況です。

register.php、register.tpl、writer.php

register.tpl はフォームを作成します

register.php はフォームを処理しますが、最初にフォームが乱数を作成します。この乱数は register.tpl で変数、つまり {vcode} として取得されます。

その乱数は、次のコンテキストで使用されます。

<img src="/system/writer.php?R=0&amp;T={vcode}" />
<input type="hidden" name="syscode" value="{vcode}" />
<strong>Enter Code:</strong>
<input name="code" type="text" id="code" />

writer.php は vcode の値を取り込み、画像を作成します。

問題:

を。vcode はボットによって読み取られる可能性があるため、このキャプチャは役に立ちません。

b. register.php は syscode != code かどうかを尋ねますが、やはり syscode は役に立たないフィールドであるため、ボットが読み取ることができます。

c. register.php で乱数を生成するプロセスを実行し、それを writer.php に配置しましたが、次のように、register.php に作成されたランダム変数の値を取得して比較を行うことができません。

writer.php には $randno = and(1,999999); があります。その値は画像として表示されます - 皆さんご存知だと思いますが、次のように比較できるように $randno を読み取るか、値を取得するために register.php が必要です。

if $code = $randno { スタッフ }

基本的な問題は、TPL ファイルを使用して信頼できるキャプチャを作成することです...それほど簡単ではありません。

毎回、あなたの支援と私を助けようとしてくれてありがとう。

4

1 に答える 1

0

簡単な解決策:

セッション ストアを使用してコードを保存するか、データベースを使用します。

register はコードを生成し、このコードをセッション/データベースに保存します。

データベースを使用したい場合は、他のコードへのブルートフォースを避けるために、ランダムトークンなども使用してください。

そうでない場合、攻撃者はすべてのキャプチャを無効にすることができ、ユーザーは登録できなくなります。

セッションを使用する場合は、トークン、データベース、隠しフィールド、および writer.php のパラメーターを省略できます。

ただし、セッションを使用したくない場合:

register.php:

if(form_is_submitted()) {
  /*check captcha */
  $captcha_id = (int) $_POST['captcha_id'];
  //SELECT code, token FROM captchas WHERE id = $captcha_id 
  if($token != $_POST['token'] ) 
    die("Error");

  // DELETE FROM captchas where id = ...

  if( $code != $_POST['code'])
    // -> error

}
/* Display form */
$code = generate_code();
$token = generate_token();
mysql_query("INSERT INTO captcha (code, token) VALUES ($code, $token)");
$tpl['chaptcha_id'] = mysql_insert_id()

register.tpl

<img src="/system/writer.php?R=0&amp;T={captcha_id}" />
<input type="hidden" name="token" value="{token}" />
<input type="hidden" name="captcha_id" value="{captcha_id}" />
<strong>Enter Code:</strong>
<input name="code" type="text" id="code" />
于 2013-04-30T03:10:20.007 に答える