web-dev-qa-db-ja.com

Google reCAPTCHA:ユーザーレスポンスを取得し、サーバー側で検証する方法

Java(JSP + Servlet)Webアプリケーションを実行しています(この質問は技術に依存しないことを理解しています)。最新のGoolge reCAPTCHAサービスを使用したいと考えています。

ここにあるGoolge reCAPTCHAの例で遊んでいます:

https://developers.google.com/recaptcha/docs/display#config

<html>
  <head>
    <title>reCAPTCHA demo: Simple page</title>
     <script src="https://www.google.com/recaptcha/api.js" async defer></script>
  </head>
  <body>
    <form action="?" method="POST">
      <div class="g-recaptcha" data-sitekey="my_site_key"></div>
      <br/>
      <input type="submit" value="Submit">
    </form>
  </body>
</html>

次のように表示されたレカプチャ画像を見ることができます:

enter image description here

「私はロボットではありません」をチェックすると、次のメッセージが表示されます。

enter image description here

ご覧のとおり、[確認]ボタンがあり、テストに基づいて、ユーザーの応答が確認のためにGoogleに送信されます。

ユーザーレスポンスを取得して、自分のバックエンドコードでユーザーレスポンスを確認するにはどうすればよいですか(Googleが https://developers.google.com/recaptcha/docs/verify で提案したとおり)。

g-recaptcha-response POST parameter when the user submits the form on your site

サーバー側では、「送信」ボタンをクリックして、ユーザーが最初にGoogleで正常に検証された場合にのみ、パラメーター「g-recaptcha-response」からユーザー入力を取得できます。それ以外の場合、「g-recaptcha-response」はサーバー側で空白です。これは、クライアント側の検証が成功した後にのみ、サーバー側の検証を実行できることを意味します。もしそうなら、Google reCAPTHAが提供するオプションであるサーバー側で別の検証を行うポイントは何ですか?

何か不足していますか?

28
curious1

新しいGoogle Recaptchaの素晴らしい点は、検証がウィジェットに完全にカプセル化されたことです。つまり、ウィジェットは質問を処理し、ユーザーが実際に人間であると判断するまで応答を検証します。その場合にのみg-recaptcha-response値を取得します。

しかし、それはあなたのサイトをHTTPクライアントのリクエスト偽造から安全に保ちません。

HTTP POSTの知識がある人は誰でもg-recaptcha-responseフォームフィールド内にランダムデータを配置し、このフィールドがGoogleウィジェットによって提供されたと思わせるようにサイトをフォールできます。 。したがって、このトークンを検証するにはhaveを使用します。

人間のスピーチでは、次のようになります。

  • Your Server:ちょっとGoogle、彼がロボットではないことを教えてくれる男がいます。彼は、あなたが彼が人間であることをすでに確認していると言い、その証拠としてこのトークンを渡すように言った。
  • Google:うーん...このトークンを確認してください...はい、この男を覚えています彼に贈ったこのトークン...ええ、彼は肉と骨でできていますスルー。
  • Your Server:ちょっとGoogle、彼が人間だと言う別の男がいます。彼はトークンもくれました。
  • Google:うーん...前回あなたがくれたのと同じトークンです...この男があなたをだまそうとしていると確信しています。あなたのサイトから降りるように彼に言ってください。

応答の検証は本当に簡単です。 GETリクエストを行うだけです

https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

response_stringg-recaptcha-responseフィールドで以前に取得した値に置き換えます。

successフィールドを持つJSON応答を取得します。

詳細はこちら:https://developers.google.com/recaptcha/docs/verify

78
TheRueger

ログインサーブレットでreCaptchaの応答を確認するために使用する方法。 Java.jsonパッケージのクラスを使用します。 JsonObjectでAPIレスポンスを返します。

成功フィールドでtrueまたはfalseを確認してください

private JsonObject validateCaptcha(String secret, String response, String remoteip)
{
    JsonObject jsonObject = null;
    URLConnection connection = null;
    InputStream is = null;
    String charset = Java.nio.charset.StandardCharsets.UTF_8.name();

    String url = "https://www.google.com/recaptcha/api/siteverify";
    try {            
        String query = String.format("secret=%s&response=%s&remoteip=%s", 
        URLEncoder.encode(secret, charset), 
        URLEncoder.encode(response, charset),
        URLEncoder.encode(remoteip, charset));

        connection = new URL(url + "?" + query).openConnection();
        is = connection.getInputStream();
        JsonReader rdr = Json.createReader(is);
        jsonObject = rdr.readObject();

    } catch (IOException ex) {
        Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }

        }
    }
    return jsonObject;
}
10
Rob Kraft

こんにちは、クライアント側でもGoogle Recaptchaを検証できます 100%の仕事 あなたのGoogle recaptchaを確認するために、以下のコードを参照してください
html本文のこのコード:

 <div class="g-recaptcha" id="rcaptcha" style="margin-left: 90px;" data-sitekey="my_key"></div>
 <span id="captcha" style="margin-left:100px;color:red" />

次のコードは、呼び出しget_action(this)メソッドフォームボタンの先頭セクションに配置されます。

function get_action(form) {

var v = grecaptcha.getResponse();
if(v.length == 0)
{
    document.getElementById('captcha').innerHTML="You can't leave Captcha Code empty";
    return false;
}
 if(v.length != 0)
 {
    document.getElementById('captcha').innerHTML="Captcha completed";
    return true; 
 }
}
3
Pravin Sharma