勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

formにGoogle reCAPTCHA v3を組み込み、PHPでスコア判定する方法

  PHP Google

だいぶ前にGoogle reCAPTCHA v2をformに組み込むという記事を書いたが今回はv3を組み込みたい。また、v3の場合は画像認証ではなくスコア(しきい値)判定になるので、その判定部分をPHPで制御したい。以下に実装方法をメモ。

 

Google reCAPTCHA

公式サイト

https://developers.google.com/recaptcha?hl=ja

ダッシュボード

https://www.google.com/recaptcha/admin/

 

サイト登録

ダッシュボードからGoogleアカウントでログインしreCAPTCHAを導入したいサイトを登録する。

サイトキー及びシークレットキーが発行されるのでメモっておく。

 

実装方法

form側(index.php)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<form action="./check.php" method="post">
<input type="hidden" name="recaptcha_response" id="recaptchaResponse">
<input type="submit" value="submit">
</form>
<script src="https://www.google.com/recaptcha/api.js?render=【サイトキー】"></script>
<script>
grecaptcha.ready(function() {
grecaptcha.execute('【サイトキー】', {action: 'submit'}).then(function(token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
});
});
</script>
<form action="./check.php" method="post"> <input type="hidden" name="recaptcha_response" id="recaptchaResponse"> <input type="submit" value="submit"> </form> <script src="https://www.google.com/recaptcha/api.js?render=【サイトキー】"></script> <script> grecaptcha.ready(function() { grecaptcha.execute('【サイトキー】', {action: 'submit'}).then(function(token) { var recaptchaResponse = document.getElementById('recaptchaResponse'); recaptchaResponse.value = token; }); }); </script>
<form action="./check.php" method="post">
    <input type="hidden" name="recaptcha_response" id="recaptchaResponse">
    <input type="submit" value="submit">
</form>

<script src="https://www.google.com/recaptcha/api.js?render=【サイトキー】"></script>
<script>
grecaptcha.ready(function() {
    grecaptcha.execute('【サイトキー】', {action: 'submit'}).then(function(token) {
        var recaptchaResponse = document.getElementById('recaptchaResponse');
        recaptchaResponse.value = token;
    });
});
</script>

サイトキー部分は適宜変更すること。

スコア判定側(check.php)

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha_secret = '【シークレットキー】';
//スコアを小数値で設定
$score = 0.5;
$recaptch_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_params = [
'secret' => $recaptcha_secret,
'response' => $recaptcha_response,
];
$recaptcha = json_decode(file_get_contents($recaptch_url . '?' . http_build_query($recaptcha_params)));
if( $recaptcha->score >= $score ){
echo '認証成功';
}else{
echo '認証失敗';
}
<?php $recaptcha_response = $_POST['recaptcha_response']; $recaptcha_secret = '【シークレットキー】'; //スコアを小数値で設定 $score = 0.5; $recaptch_url = 'https://www.google.com/recaptcha/api/siteverify'; $recaptcha_params = [ 'secret' => $recaptcha_secret, 'response' => $recaptcha_response, ]; $recaptcha = json_decode(file_get_contents($recaptch_url . '?' . http_build_query($recaptcha_params))); if( $recaptcha->score >= $score ){ echo '認証成功'; }else{ echo '認証失敗'; }
<?php
$recaptcha_response = $_POST['recaptcha_response'];
$recaptcha_secret = '【シークレットキー】';

//スコアを小数値で設定
$score = 0.5;

$recaptch_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_params = [
    'secret' => $recaptcha_secret,
    'response' => $recaptcha_response,
];
$recaptcha = json_decode(file_get_contents($recaptch_url . '?' . http_build_query($recaptcha_params)));

if( $recaptcha->score >= $score ){
    echo '認証成功';
}else{
    echo '認証失敗';
}

シークレットキー及びスコア($score)部分は適宜変更すること。

 

その他

reCAPTCHAとの接続エラーチェック

シークレットキーが間違っている等でreCAPTCHAとの接続エラーがあった場合は$recaptchaに以下内容が入る。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
object(stdClass)#1 (2) {
["success"]=>
bool(false)
["error-codes"]=>
array(1) {
[0]=>
string(20) "missing-input-secret"
}
}
object(stdClass)#1 (2) { ["success"]=> bool(false) ["error-codes"]=> array(1) { [0]=> string(20) "missing-input-secret" } }
object(stdClass)#1 (2) {
  ["success"]=>
  bool(false)
  ["error-codes"]=>
  array(1) {
    [0]=>
    string(20) "missing-input-secret"
  }
}

そのため「$recaptcha->success」で接続の成否をチェックできる。また、エラー時は「$recaptcha->error-codes」をループで回すとエラーコードが確認できる。

v2を組み込みたい場合

v3ではなくv2を組み込みたい場合は以下過去記事を参照。

https://taitan916.info/blog/archives/3162

 - PHP Google

  関連記事

CodeIgniter4 & reCAPTCHA でお問い合わせフォームを作成する方法

以前CodeIgniter4.4.4で簡易的なお問い合わせページを作成したが、今 ...

reCAPTCHA v2でAjaxは使わずにチェック状況を確認する方法

reCAPTCHA v2を実装する案件があり以前の記事を参考に組み込んでみたもの ...

迷惑メール対策でフォームにGoogle reCAPTCHA v2を導入する方法

お問い合わせフォームのスパムメール対策としてreCAPTCHAを導入したいという ...

S