MaxMindジオロケーションDBの自動更新を装備、IP Geo Blockの更新告知

このところ海外からのスパムを弾く拙作の WordPress プラグイン IP Geo Block の機能アップにかなりの時間を割いています。

最初のバージョンで IP アドレスから国が引ける API をネット越しに叩き、次いでサーバー負荷の低減を狙って キャッシュを実装した ワケですが、ここ最近、無料 RESTful API のサービス中止が相次いだため、急ぎ安定した MaxMind無料 GeoLite データベース を使えるようにする必要があった次第です。

プログラミングは嫌いな方ではないですが、スパムやら bot 対策は何も新しいものを生みません。一所懸命に作り込んでも空しさが拭えないので、せめてココで告知させて下さい 😉 。

2014年10月13日 追記

今回のバージョンアップではオプションテーブルの更新が必要なのですが、自動更新では更新処理が働きません。対応策が見つかるまではお手数ですが、更新後に一旦
「停止」し、再度「有効化」していただくよう、お願いします m_(..)_m。

MaxMind GeoLite データベースに関する仕様

MaxMind の GeoLite データベースは、月に1度、月初に更新されます。これに合わせ、プラグインのインストール後は WordPress のクローンで定期的にダウンロードする仕様としました。また MaxMind のサーバーは、Last-Modified ヘッダをちゃんと返すので、最終更新の1ヶ月+α後に If-Modified-Since リクエストヘッダを付けて落としに行きます。

「+α」の部分はアクセスを集中させないための乱数で、1〜6日まで幅を持たせています。また 304 Not Modified が返ってきた場合は、24時間後に再リクエストを試みます。

あまり高頻度にリクエストすると 403 Forbidden が返ってきたりするので、この辺りは緩やかな仕様としています。

またデータベースは IPv4 用と IPv6 用があり、両方とも落とします。実は IPv6 用で IPv4 も引けるのですが、容量が IPv4 用より大きく検索時間がかかるので、使い分けるようにしています。

もう少し細かな話をすると、ダウンロードには wp_remote_get() を使っています。このため gzip 全データをメモリ中に読み込んでからファイルに書き出す事になりますが、容量的には 1.3MB 程度なのでメモリ不足になる事はないでしょう。

実は download_url() という関数を使えば、巨大なファイルも stream として落とせるのですが、先の If-Modified-Since が効かなくなるので使っていません。

この辺りは、HEAD メソッドでヘッダー情報だけ取得するようにすれば良いだけなので、いずれ省メモリ化を計りたいと思います。

技術情報

その他の更新項目

IP2LocationのIPv6用データベースのサポート

IP2Location の無料データベース IP2Location LITE が、10月1日のリリースから IPv6 をサポートするようになりました。

We are glad to announce that IP2Location is supporting IPv6 database in all products from this release.

10月のニュースレターより

IP2Locationデータベースのダウンロード

これらのファイルを database.bin にリネームし、wp-content/ip2location/ に置けば利用可能です(登録帰属リンク が必要)。ファイルサイズが大きくなるほど検索時間もかかるので、出来る限りコンパクトな形式を選択するのが吉です。

技術情報

RESTful APIの更新

API の幾つかが、サービス停止あるいはキーを要求するようになったので、削除しました。ストックはまだ幾つかあるのですが、MaxMind の自動ダウンロードにより、ほぼメンテナンス・フリーとなったため、今後は緩やかに削減の方向になると思います。

判定処理の効率化

前バージョンでは、コメントのチェックも想定し、preprocess_comment アクション・フィルタをフックしていましたが、pre_comment_on_post に変更しました。これにより wp-comments-post.php へのアクセス直後に判定でき、サーバー負荷が軽減されます。

今後は?

セキュリティ用プラグインとして本格的な Wordfence Securityプレミアム版 には、スパムや wp-login.php への Brute Force 攻撃 を防御するための Country Blocking という機能がありますが、有料です。

これが無料で提供できれば少しは価値があるかな?と思っています。ただセキュリティ用となると、海外からのアクセスを弾くだけでは成り立ちません。あまりコードを肥大化させる事なく実現できる道を探っていきたいと思います。

コメントを残す

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

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