Edited at

GoogleのreCAPTCHA v3をPHPで使う


reCAPTCHA v3について

バージョン3からユーザーが画像の選択などぽちぽちしなくてよくなって、スコアが返ってくるそうです。

reCAPTCHA v3

connpassにも導入されていました。

右下にリキャプチャのマークが表示されるだけで、ユーザーからすると何も選択しなくて良いので楽ですね。


導入する手順

先ほどの公式のガイドにキーの取得の仕方とフロントエンドでどのように実装すれば良いか記載されています。

PHPを使う場合には下記の記事に詳細に書かれています。(英語だけど)

Adding Google reCAPTCHA v3 to a PHP form

問題なく導入できている場合には、右下にリキャプチャのマークが表示されますが、APIkeyが間違っている時などは赤文字が出るのでそれも確認しておくと良いと思います。


スコアについて

先ほどの記事の中にあるコードですが、リキャプチャからのレスポンスに含まれるスコア(0.0 ~ 1.0)に応じて処理を分けています。

// Take action based on the score returned:

if ($recaptcha->score >= 0.5) {
// Verified - send email
} else {
// Not verified - show form error
}

スコアが返ってくる仕様になっていると聞いて、もし不正ではないと思われるユーザーが認証できない場合に、このスコアで調整できると思っていました。

実際に導入をしてみると、ほとんどのアクセスが0.9で、そのあと0.7,0.3,0.1と4パターンしか確認できなかったので、あまりスコアの調整をしてもって感じもします。


スコアが低くなる場合

こちらの記事によると下記のパターンではスコアが低くなったそう

reCAPTCHA v3 入れてみた

0.1:アドオンでユーザーエージェントを変更した場合(実際はFirefoxなのにEdgeなど)

0.7:広告ブロック機能を持ったブラウザ

0.7は広告ブロックしているからではなく、ユーザーエージェントがレアだからかもしれないと考え、Firefoxにそのユーザーエージェントを設定してみましたが、スコアは0.1でした。

実際にUser-Agent Switcher for Chromeを使ってUAを変更してみると、スコアが0.1で認証できませんでした。

また、chromeの開発者ツールで変更した場合にも同様の結果でした。


認証ができないケース

上記の検証とは別に、ユーザーから認証ができないとの問い合わせがくるので、いくつか認証できないパターンを調べました。


googleのjsの実行を許可していない

これは前のバージョンのリキャプチャからだと思いますが、導入しているサイトのドメインとGoogleのドメインのJSを許可する必要があります。

実際にいたユーザーの方で、ホワイトリスト形式でJSの実行を許可するaddonを使っており、リキャプチャを導入しているサイトのJSは許可しているけど、Googleは許可していないという方は認証ができていませんでした。

NoScript Security Suite


セキュリティソフトによる影響

これは実際に手元で検証できた訳ではないですが、どうしても認証ができないユーザーがの方が、使っていたセキュリティソフトを無効にしたところその後は認証ができるようになったとの報告がありました。


tokenの有効期限切れ

具体的な時間はわかりませんが、10分も有効期限はないです。基本的には問題ないと思いますが。。

Using reCAPTCHA v3 in the frontend #281


token取得までのタイムラグ

先ほどのAdding Google reCAPTCHA v3 to a PHP formに沿って実装すると、トークンをhiddenタグに埋め込みます。

<input type="hidden" name="recaptcha_response" id="recaptchaResponse">

実際にtokenの取得までに(感覚的にですが)1秒弱時間がかかるので、完了の前にリクエストを送るとエラーになります。パスワードなどがブラウザ側に保存されていて、すぐに認証が実行できる場合には、このケースは発生しうるかと思います。


スコアを確認する方法

admin consoleからリクエスト数やそれぞれのスコアを確認できるので、こちらも参考にしてください。