reCAPTCHAでコメントスパムや検索スパムを撃退する

reCAPTCHAでコメントスパムや検索スパムを撃退する

Posted at October 12,2017 12:03 AM
Tag:[reCAPTCHA]

reCAPTCHAでコメントスパムや検索スパムを撃退する方法を紹介します。

eCAPTCHAのサイト

1.はじめに

以前reCAPTCHAに関する記事をエントリーしました。

当時は表示された画像や音声の文字を入力する方式でしたが、最近Googleでも利用されているreCAPTCHAはチェックボックスにチェックするだけの簡易なUIになり、各段に使いやすくなっています。

で、以前から当ブログに対する検索スパムがひどいため、これを使って実装してみることにしました。

ちなみに2017年10月現在、このブログの右サイドバーにある検索フィールドに適用しています。

2.reCAPTCHAへのウェブサイト登録

GoogleのreCAPTCHAのサイトへアクセス。

reCAPTCHAのサイト
reCAPTCHAのサイト

右上の「Get reCAPTCHA」をクリック。

eCAPTCHAのサイト

reCAPTCHAの設定画面が表示されます。

(クリックで拡大、以下同様)
reCAPTCHAの設定画面

Labelに任意の文字列(ここでは『小粋空間」)を入力し、「Choose the type of reCAPTCHA」から利用するreCAPTCHA(ここでは「I'm not a robot(私はロボットではありません)」)を選択します。

reCAPTCHAの設定画面

タイプを選択すると、ドメイン設定フィールドが表示されます。

ドメイン設定フィールド

「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.参考サイト

参考サイトは下記です。ありがとうございました。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)