reCAPTCHAでコメントスパムや検索スパムを撃退する
reCAPTCHAでコメントスパムや検索スパムを撃退する方法を紹介します。
1.はじめに
以前reCAPTCHAに関する記事をエントリーしました。
当時は表示された画像や音声の文字を入力する方式でしたが、最近Googleでも利用されているreCAPTCHAはチェックボックスにチェックするだけの簡易なUIになり、各段に使いやすくなっています。
で、以前から当ブログに対する検索スパムがひどいため、これを使って実装してみることにしました。
ちなみに2017年10月現在、このブログの右サイドバーにある検索フィールドに適用しています。
2.reCAPTCHAへのウェブサイト登録
GoogleのreCAPTCHAのサイトへアクセス。
右上の「Get reCAPTCHA」をクリック。
reCAPTCHAの設定画面が表示されます。
Labelに任意の文字列(ここでは『小粋空間」)を入力し、「Choose the type of reCAPTCHA」から利用するreCAPTCHA(ここでは「I'm not a robot(私はロボットではありません)」)を選択します。
タイプを選択すると、ドメイン設定フィールドが表示されます。
「Domains」に該当のドメインを入力し(複数ドメイン設定する場合は1行につき1ドメイン)、「Accept the reCAPTCHA Terms of Service.(利用規約)」にチェックして「Register」をクリック。
これで登録されました。運用で利用するのは一番上に表示されている「Site key」と「Secret key」です。「Secret key」は外部に知られないよう注意してください。
3.ウェブサイトの実装
head終了タグの前に下記のタグを追加します。
<script src="https://www.google.com/recaptcha/api.js"></script>
reCAPTCHAウィジェットを表示するformタグの最後に、下記のスニペットを追加します。
<div class="g-recaptcha" data-sitekey="[Site key]"></div>
4.サーバサイドの実装
サーバサイドの実装ですが、ウェブサイトにreCAPTCHAのフィールドを追加することで、フォーム送信時に"g-recaptcha-response"というPOSTフィールドが追加されます。
そのフィールドの値と「Secret key」の値および、リモートIPアドレスを下記のURLに追加し、後述するスクリプトなどを使ってリクエストを送信します。
https://www.google.com/recaptcha/api/siteverify
追加例:
https://www.google.com/recaptcha/api/siteverify?secret=[Secret key]&response=[g-recaptcha-responseの内容]&remoteip=[リモートIPアドレス]
このリクエストに対し、下記のレスポンスが返ってくるので、これを判定すればOKです。
{
"success": true|false,
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
以下、Perlでの実装例で、"success"フィールドのみ判定しています。
#!/usr/bin/perl
use strict;
use CGI;
use LWP::UserAgent;
use JSON::Parse;
my $secret_key = '[シークレットキー]';
my $url = 'https://www.google.com/recaptcha/api/siteverify';
my $cgi = CGI->new();
my $ua = LWP::UserAgent->new();
my $recaptcha_response = $cgi->param('g-recaptcha-response');
my $remote_ip = $ENV{REMOTE_ADDR};
my $response = $ua->post(
$url,
{
remoteip => $remote_ip,
response => $recaptcha_response,
secret => $secret_key,
},
);
if ( $response->is_success() ) {
my $json = $response->decoded_content();
my $out = parse_json($json);
if ( $out->{success} ) {
# 正常処理
}
}
5.参考サイト
参考サイトは下記です。ありがとうございました。
- PDFやWordをGoogleで翻訳する方法
- Googleカレンダーをウェブサイトやブログに表示する方法
- AdsenseのURLやドメインを調べて自己クリックやブロックする方法
- Google+ APIのOAuth認証によるログイン方法のまとめ
- GoogleリーダーからOPMLファイルをエクスポートする方法
- Googleトレンドの使い方
- Google検索結果に著者情報を表示する(完全版)
- ページ読み込みが早いとGoogle検索順位が本当に上がるのか試してみた
- ウェブサイトのパフォーマンス測定サービス「WebPageTest」
- Googleのスマホ最適化支援サービス「GoMo」でサイト診断
- Google+1(プラスワン)でJavaScriptエラーが発生する件について
- Android端末のWiFi接続にGoogle Public DNSを設定する
- iPhoneとAndroidの違いを絵に描いてみた
- 「8.8.8.8,8.8.4.4」より速い「129.250.35.250」
- Google カスタム検索が爆速な件