12

reCAPTCHA フォーム パラメータ ( recaptcha_challenge_fieldrecaptcha_response_field ) をカスタマイズして、異なる方法で呼び出すことはできますか?

基本的に、フォーム パラメータrecaptcha_challenge_fieldを captchaId と呼び、recaptcha_response_fieldcaptchaUserResponseと呼びたいと考えています。

キャプチャの実装を抽象化できるように名前を変更したい...リクエストが到着したとき

POST /mysite/userSignup

キャプチャの実装(reCaptcha、または将来的には別のもの)に煩わされたくありません-適切なキャプチャ実装の適切なパラメーターを抽出し、それらのパラメーター名を統一したいと思います。

今、私のリクエストは次のようになります:

POST /mysite/userSignup HTTP/1.1
Host: localhost:80
Connection: keep-alive
Content-Length: 416
Cache-Control: max-age=0
Origin: http://localhost:80
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://localhost:8080/mysite/signup/form.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,hr;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

email:testUser%40gmail.com
username:testUser
password:test
password2:test
forename:Test
surname:User
recaptcha_challenge_field:<google generated challange>
recaptcha_response_field:<user typed captcha answer>
submit:Submit

しかし、私はそれを次のようにしたい:

POST /mysite/userSignup HTTP/1.1
Host: localhost:80
Connection: keep-alive
Content-Length: 416
Cache-Control: max-age=0
Origin: http://localhost:80
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://localhost:8080/mysite/signup/form.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,hr;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

email:testUser%40gmail.com
username:testUser
password:test
password2:test
forename:Test
surname:User
captchaId:<google generated challange>
captchaUserResponse:<user typed captcha answer>
submit:Submit

洗練された方法は、次のようにフォーム パラメータ名を指定することです。

<script>
   var RecaptchaOptions = {
      recaptcha_challenge_field_formparam_name : 'captchaId',
      recaptcha_response_field_formparam_name: 'captchaUserResponse'
   };
</script>

これが不可能な場合、どのような回避策をお勧めしますか?

4

6 に答える 6

3

それは不可能です。考えられる解決策、AFAIU は、フォーム送信の直前に元の値をコピーする新しい DOM 要素を追加することです。次に例を示します。

<!-- the HTML part -->
<input type="hidden" id="captchaId">
<input type="hidden" id="captchaUserResponse">

// the JavaScript (jQuery) part
$('form').submit(function(){
  $('input#captchaId').
    val($('input#recaptcha_response_field').val());
  $('input#captchaUserResponse').
    val($('input#recaptcha_challenge_field').val());
  return true;
})
于 2012-06-01T05:18:05.553 に答える
3

追加のフィールドは必要ありません。フォーム要素を ID で識別し、送信前に相対名を変更するだけです。

次のフォームがあると仮定します。

<div id="captcha" class="item recaptcha">
...
<textarea id=custom1 name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
<input id=custom2 name="recaptcha_response_field" value="manual_challenge" type="hidden" />
<input type="submit" name="submit" value="Submit">
</div>

を使用して名前を変更できます

document.captcha.custom1.name='captchaId'
document.captcha.custom2.name='captchaUserResponse'

これらの変更は、onclick イベントを使用して、送信ボタンに直接または間接的に (別のメソッドを呼び出して) 含めることができます。

したがって、直接変更する場合、送信は次のようになります。

<input type="submit" name="submit" value="Submit" onclick="document.captcha.custom1.name='captchaId';document.captcha.custom2.name='captchaUserResponse';return true">
于 2012-06-08T11:05:05.637 に答える
2

ほら、私はあなたと同じ状況にあり、これが私がそれを作成した方法です:

短いバージョン:
ここで、この属性をフォームに追加してください。必要なのはこれだけです:

EDIT2 - 純粋な Javascript コードを追加:

pure-Javascript アプローチ
IE8、FF12、および Chrome でテスト済み:

onsubmit="javascript:(function(p){var a=p.getElementsByTagName('input');var attr='';var toAttr='';for (var i in a){try {attr=a[i].getAttribute('name')} catch(e) {continue;}switch(attr){case 'recaptcha_challenge_field':{toAttr='captchaId';break;}case 'recaptcha_response_field':{toAttr='captchaUserResponse';break;}}a[i].setAttribute('name',toAttr);}p.submit();})(this)"

jQuery アプローチ:

onsubmit="javascript:(function(p){var f=$(p);$('input[name=recaptcha_challenge_field]',f).attr('name','captchaId');$('input[name=recaptcha_response_field]',f).attr('name','captchaUserResponse');f.submit();})(this)"

例えば:

<form method="post" action="verify.php" onsubmit="javascript:(function(p){var f=$(p);$('input[name=recaptcha_challenge_field]',f).attr('name','captchaId');$('input[name=recaptcha_response_field]',f).attr('name','captchaUserResponse');f.submit();})(this)">
    <?php
    require_once('recaptchalib.php');
    $publickey = "your_public_key"; // you got this from the signup page
    echo recaptcha_get_html($publickey);
    ?>
    <input type="submit" />
</form>

ロングバージョン:
これが私がやっていることです:

1-これは、入力の名前を置き換えることを担当する実際のjavascript関数です。ここでは特別なことは何もありません:

function(param){
    var form = $(param);
    $('input[name=recaptcha_challenge_field]',form).attr('name','captchaId');
    $('input[name=recaptcha_response_field]',form).attr('name','captchaUserResponse');
    form.submit();
}

2-onsubmit前述の関数を匿名関数にして、インライン HTML イベント ( event)経由で呼び出すことができるようにします。

(function(param){...function code...})(this)
  • 気づいた(this)?匿名関数の最後に? これにより、フォームのハンドルを関数に渡すことができます。

3-クライアントの変更(またはあなたが言った介入?)をできるだけ少なくする必要があるため、HTMLインラインイベントハンドラーからこの匿名関数を呼び出します。この場合、最適なハンドラーはonsubmitです。

正直なところ、私はこのソリューションを自分で楽しんでいました。あなたにとっても役立つことを願っています:D

EDIT1:

ちなみに、このようにしたい場合、私はあなたのコメントに気づいていません:

<form><!--blah blah--></form>
<script type="text/js" src="somewhere"></script>

これらは短所です:

  1. 余分な HTTP リクエストを追加しています!! なぜ?
  2. フォームのロード完了イベントから非同期にしているため、不正確になります
  3. その特定の時間に Web サーバーがクライアントの要求を拒否するのではないかと考えたことはありますか? それでどうなるの?サーバー側のスクリプトが壊れます。
  4. サーバー側でフォームを印刷している場合、サーバー側でこれらの変更を行わないのはなぜですか?
于 2012-06-09T11:08:52.453 に答える
2

後で reCAPTCHA 以外のものを使用することにした場合でも、同じ方法で処理できるように、captcha を処理する一般的な方法が必要です。あなたの考え方は素晴らしいと思いますが、抽象化が深すぎます。

理想的には、その機能だけを実行するブラック ボックスのキャプチャ システムが必要であり、どのキャプチャ プラグインがボックスに含まれているかを気にする必要はありません。そのボックスから抜け出すために必要な唯一のことは、ユーザーが正しいことを入力したかどうかです。

ブラック ボックスがこのチェックを行う方法を指示しようとすると、ボックスをいじっていることになります。さらに、別のキャプチャ プラグインに切り替える場合は、そのプラグインも変更する必要があります。

これらの理由から、is_human_userメソッド (またはそれを呼び出したいもの) の 1 つだけを抽象化することをお勧めします。使用するキャプチャ プラグインごとにこのメソッドを実装するだけで済みます。reCAPTCHA の場合、このメソッドは を返すようrecaptcha_challenge_field == recaptcha_response_fieldです。次に、チェックが呼び出すだけでis_human_user、実装が何であるかがわかりません。

これがあなたが探している答えでない場合は申し訳ありませんが、一歩下がって、なぜそのうさぎの穴に落ちているのかを思い出すことが常に重要です.

于 2012-06-13T23:40:35.583 に答える
1

すべてのキャプチャは独自の検証関数を使用するため、キャプチャの実装を抽象化しすぎることはできないと思いますが、クライアント側でキャプチャ フィールドの名前を変更することは最善の解決策ではありません。クライアントで JavaScript が有効になっていない場合それは単に機能しません。

これを考慮すると、フィールドの名前を抽象化する最良の方法は、サーバー側で変数を使用することだと思います。フォームの投稿を受け取った後、次のことができます。

$captchaId = $_POST["recaptcha_challenge_field"];
$captchaUserResponse = $_POST["recaptcha_response_field"];

次に、これを次のような一般的な検証関数に渡します。

recaptcha_generic_check ("PrivateKey", $_SERVER["REMOTE_ADDR"], $captchaId, $captchaUserResponse);

理想的には、この方法では、ポストで受け取ったフィールドの名前 (およびもちろん機能) を変更するだけでよく、すべてが同じままです。

于 2012-06-11T23:53:49.393 に答える