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>
次のように表示されたレカプチャ画像を見ることができます:
「私はロボットではありません」をチェックすると、次のメッセージが表示されます。
ご覧のとおり、[確認]ボタンがあり、テストに基づいて、ユーザーの応答が確認のために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が提供するオプションであるサーバー側で別の検証を行うポイントは何ですか?
何か不足していますか?
新しいGoogle Recaptchaの素晴らしい点は、検証がウィジェットに完全にカプセル化されたことです。つまり、ウィジェットは質問を処理し、ユーザーが実際に人間であると判断するまで応答を検証します。その場合にのみg-recaptcha-response値を取得します。
しかし、それはあなたのサイトをHTTPクライアントのリクエスト偽造から安全に保ちません。
HTTP POSTの知識がある人は誰でもg-recaptcha-responseフォームフィールド内にランダムデータを配置し、このフィールドがGoogleウィジェットによって提供されたと思わせるようにサイトをフォールできます。 。したがって、このトークンを検証するにはhaveを使用します。
人間のスピーチでは、次のようになります。
応答の検証は本当に簡単です。 GETリクエストを行うだけです
response_stringをg-recaptcha-responseフィールドで以前に取得した値に置き換えます。
successフィールドを持つJSON応答を取得します。
ログインサーブレットで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;
}
こんにちは、クライアント側でも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;
}
}