エラーメッセージサイトがreCAPTCHAソリューションを検証していないことを検出しました。これは、サイトでreCAPTCHAを適切に使用するために必要です。詳細については、開発者向けサイトをご覧ください。このreCaptchaコードを作成しましたが、うまく機能しますが、どのように検証すればよいのかわかりません。関数grecaptcha.getResponse();
ですが、そうではありませんでした。どうやらrecaptchaはウェブサイトでうまく機能しましたが、私はGoogle管理者に次のメッセージを見ました:
要件:1.フォームで_action="file.php"
_を使用しないでください。フォームではJavaScript関数のみを使用してください。
_ <!DOCTYPE>
<html>
<head >
<title></title>
<script src='https://www.google.com/recaptcha/api.js'></script>
<script type="text/javascript">
function get_action() {
var v = grecaptcha.getResponse();
console.log("Resp" + v );
if (v == '') {
document.getElementById('captcha').innerHTML = "You can't leave Captcha Code empty";
return false;
}
else {
document.getElementById('captcha').innerHTML = "Captcha completed";
return true;
}
}
</script>
</head>
<body>
<form id="form1" onsubmit="return get_action();">
<div>
<div class="g-recaptcha" data-sitekey="6LdNIlAUAAAAADS_uVMUayu5Z8C0tw_jspdntbYl"></div>
</div>
<input type="submit" value="Button" />
<div id="captcha"></div>
</form>
</body>
</html>
_
手伝ってくれませんか。 _action="file.php"
_の代わりにJavaScript関数onsubmit="return get_action();"
を使用する必要があるので、どのように検証すればよいですか?
grecaptcha.getResponse()
関数はユーザー応答トークンのみを提供します。このトークンは、Google reCAPTCHAサーバーで_HTTP POST
_呼び出しを使用して検証する必要があります。
AJAXリクエストを使用してトークンを検証できますが、これらの検証は常にサーバー側で行う必要があります。セキュリティ上の理由-JavaScriptは常にユーザーによって操作され、だまされてreCAPTCHAの検証が成功したと信じ込まされている可能性があります。
応答トークンを取得したら、次のAPIを使用してreCAPTCHAでトークンを検証し、トークンが有効であることを確認する必要があります。
したがって、必要なのは、reCAPTCHAシークレット(reCAPTCHA管理ページで生成された2番目のキー)とユーザー応答トークン(grecaptcha.getResponse()
関数から受け取ったもの)をreCAPTCHA APIに送信することです。 reCAPTCHA docs 。
PHPでは、次のように考えます。
_$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'secret' => YOUR_RECAPTCHA_SECRET,
'response' => USER_RESPONSE_TOKEN,
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
$response = @json_decode($data);
if ($response && $response->success)
{
// validation succeeded, user input is correct
}
else
{
// response is invalid for some reason
// you can find more in $data->{"error-codes"}
}
_
これが私が提案することです...
1.)クエリ文字列をreCPATCHAスクリプトに追加します。また、パフォーマンスを向上させ、レンダリングのブロッキングを防ぐために、_async defer
_属性を_<script ...>
_に追加できます。そして、正確さのために、スクリプトをDOMの_<form>
_の後に移動する必要があります。 _...</form> <script src='https://www.google.com/recaptcha/api.js?onload=recaptchaRender' async defer></script>
_。
2.)recaptchaRender()
という新しい関数を追加します。 Googleへの検証を処理し、コールバック_get_action
_への応答をオフロードします。 _RECAPTCHA_SITE_KEY
_をGoogleサイトキーに置き換えます。
_function recaptchaRender{
grecaptcha.render( 'reCaptchSubmit', {
'sitekey': 'RECAPTCHA_SITE_KEY',
'callback': get_action
});
}
_
3.)送信ボタンに_id="reCaptchSubmit"
_を追加します。
4.)フォーム要素からonsubmit="return get_action();"
を削除します。
基本的に、スクリプトとGoogleの間の認証がありませんでした。これはフォームの検証を処理しませんが、少なくともレンダーコールバックget_action()
にアクセスできます。ここで、検証を処理できます-より関連性の高いものに名前を変更したい場合があります。つまり、validateForm()
など