IP Geo Block

海外からの投稿を弾くスパム対策用WordPressプラグインをリリースします

スパム投稿を選別して弾くプラグインは、Akismet はもちろん、CAPTCHA を使うタイプ、日本語を含まない投稿を禁止するタイプ、ロボット投稿の裏をかく隠しフィールドを備えたタイプなどなど、数多くあります。

それぞれに一長一短がある中で、投稿者の国を選別するプラグインがあっても良いんじゃない? ということで、これまた一長一短のあるプラグイン IP Geo Block を作りました。島国ニッポンならではの割り切りができる人なら、お試しください 😀 。

IP Geo Block

原理は単純で、投稿者の IP アドレスが属する国を、ローカルのデータベースまたは外部 API を利用して調べます。受け入れOKな投稿はさらに Akismet で選別される手はずとなっています。

また特徴の1つとして、スパム投稿自体を減らしてくれるかもしれない機能を搭載しています。

インストール

プラグイン公式ページ から、またはダッシュボードから IP Geo Block を検索してインストールしてください。詳細は後述しますが、同時に IP2Location の WordPress プラグイン をインストールすれば、ローカル・サーバー上のデータベースを優先して使うようになります。

設定タブ

とりあえずプラグインを有効化すれば動作するようにはなっていますが、以下、各項目について解説します。

サービスの選択とAPIキーの設定

IP アドレスを地理的な位置情報(Geo Location)に変換してくれるサービス・プロバイダーを選択します。各サービスは大抵、単位時間当たりのリクエスト数に制限を設けていますので、それを分散させるために複数を利用する仕組みです。どれも無料で利用できますが、商用利用が許可されていないサービス、アトリビューション・リンク(リンク・バック)が必要なサービス、事前にライセンスキーの発行が必要なサービスは、デフォルトでは選択されていません。

以下を参考に、サイトのタイプに合わせて選択してください。

サービス IP アドレスのタイプ ライセンス形態
IP2Location IPv4 free for personal and commercial use
freegeoip.net IPv4 free
ipinfo.io IPv4 free
Telize IPv4, IPv6 free
IPtoLatLng IPv4, IPv6 free
IP-Json IPv4, IPv6 free
Xhanch IPv4 free
mshd.net IPv4, IPv6 free
geoPlugin IPv4, IPv6 free, need an attribution link
ip-api.com IPv4, IPv6 free for non-commercial use
Smart-IP.net IPv4, IPv6 free for personal and non-commercial
IPInfoDB IPv4, IPv6 free for registered user

ちなみにこれらのサービスは、wp_remote_get() 関数で叩いています。本サイトであれば、次の様なユーザー・エージェント文字列が送られるので、ライセンスは正しく使いましょう 😉 。

WordPress/3.8.1; http://tokkono.cute.coocan.jp/blog/slow
投稿フォーム上のメッセージ

投稿フォーム上に日本以外からの投稿ができないことを伝えるメッセージを設定します。メッセージは <p> タグで囲まれます。タグは使えません。

マッチング規則、ホワイトリスト、ブラックリスト

投稿を受理する国(ホワイトリスト)、または拒絶する国(ブラックリスト)を ISO 3166-1 alpha-2 形式(2文字の国コード)で指定します。

まぁ、ブラックリスト方式は役には立たないでしょう。

レスポンスコード

これは実験的なパラメータで、拒絶した投稿に返すステータスコードを指定します。2xx3xx は遷移先の URL と共に、4xx は WordPress エラーページを、5xx は単にコードだけを返します。

通常、遷移先の URL は投稿されたページかトップページに設定するところですが、本プラグインでは ブラックホールサーバーによるフロントエンドSPOF分析のすすめ で紹介した ブラックホール・サーバー にしてあります。万が一投稿内容を確認するためにリクエストしてくれたらラッキーで、応答は返ってきません。果たして?…。

デフォルトは 「403 Forbidden」 です。

403 Forbiddenの画像

統計の保存

どれぐらいの投稿があったか、どのサービスを利用したかなどの情報を記録します。デフォルトは 「無効」 です。

アンインストール時に設定を削除

このプラグインが不要になった時に、WordPress のデータベースから設定を削除し、クリーンなアンインストールを行います。デフォルトは 「無効」 です。

その他のタブ

統計

各サービスの利用頻度と応答時間を統計情報として表示します。本サイトでここ1か月間試験運用した結果を張っておきますので、利用するサービスを選択する際の参考にしてください。

IP Geo Blockの統計タブ

検索

特定の IP アドレスを調べることができます。開発の初期段階で動作確認用に使っていましたが、運用時には使うことはないでしょう。そのうち削除するかもしれません。

リンクタブ

本プラグインで使用しているサービスのリンク集です。

IP2Location のデータベースについて

IP2Location Country BlockerIP2Location TagsIP2Location Variables など、IP2Location がリリースする無料のプラグインが正しくインストールされていれば、本プラグインはまず、これらのプラグインが提供するデータベースを参照します。そしてデータベースに IP アドレスが見つからない場合にだけ外部サービスを使うよう動作します。

ただしこれらのプラグインは /wp-content/plugins/ にインストール・有効化しただけではだめで、同梱されているデータベース・ファイル database.bin/wp-content/ip2location/ ディレクトリに置くという作業が必要になります。一旦データベース・ファイルを設置してしまえば、これらのプラグイン自体は有効化しなくてもOKです。

さらにその場合にはプラグイン自体の削除も可能です。ip2location.class.php というクラス・ファイルをデータベースと同じディレクトリにコピーしておいて下さい。本プラグインは、自動的にクラス・ファイルの所在を確認し利用します。

※ データベースやクラス・ファイルをインストール後は、本プラグインを 一旦無効化、再度有効化 し、「設定タブ」で IP2Location を選択・保存して下さい。

さてデータベースの質ですが、同梱されているのはオープン・ソース版である IP2Location LITE 中、最も IP アドレスのエントリー数が少ない DB1.LITE です。登録すればよりエントリー数の多いデータベースを(もちろん無料で)使うことができますが、アトリビューション・リンク が必要になります。データベースの網羅性を上げれば、それだけ外部 API を叩く頻度が減り、投稿者を待たせることも少なくなりますが、リンクが必要という構図です。

以下に私が調べた2月1日現在の、各データベースの IP アドレス・エントリー数とファイル容量を挙げておきます。

タイプ エントリー数 ファイル容量
DB1.LITE 99,556 0.8 MB
DB3.LITE 1,881,584 30.6 MB
DB5.LITE 1,894,764 45.9 MB
DB9.LITE 1,894,601 53.8 MB
DB11.LITE 1,894,485 61.4 MB

使用感

元々書き込みが少ないサイトなので参考になるかわかりませんが…

この1か月間で、弾いた海外からの投稿数は約1300件、受理した国内からの投稿が5件、うち1件が国内サーバーからのロシア語によるスパム投稿で Akismet が捕捉、他4件は本サイトの記事を引用してくれたピンバックによるものでした。

このぐらいの頻度なら、十分許容できるかなと思います。

ただ最近では、日本語サイトを海外サーバーで運用している方も増えてきてると思うので、そういうところからのピンバックも弾いてしまう可能性はあると思います。

またちゃんと比較したわけではありませんが、「レスポンスコード」 は 「403」 で良いと思います。設置当初は日に100件程度のスパムが来ていましたが、最近では20件弱にまで減ってきました。「こいつは投稿するだけ時間の無駄」 と判断され、リストから外されたんじゃないかと推測しています。

投稿自体が減れば CPU が無駄に使われることも減って万々歳です。まぁ、相手次第ですけどネ。

最後に…。日本以外で使われることのないプラグインだと思いますので、問題点の報告やリクエストなどは、公式ページのサポートGithub Issues から日本語でどうぞ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

海外からの投稿は受け付けていません