IPチェックの方法と注意点

携帯からのアクセスである事の確認を、IPチェックで行う際の、方法と注意点のまとめです。
一部、前の記事からの続きです。

  • IPチェック実装には、PEARのNet_IPv4を使うと良い
  • 問題は、キャリアのIP帯域に変更・追加の可能性がある事。どうやって取得・更新するか?(自動?手動?半手動?)
実装方法例

まず、IPチェックの方法は、PEARのNet_IPv4というライブラリを使って行う方法が紹介されています。
http://d.hatena.ne.jp/p4life/20070329/1175152855


OpenPNE2.x系の方法は、もっとシンプルで判りやすいんじゃないかと思います。

function is_ktai_ip()
{
    require_once 'Net/IPv4.php';
    require_once 'ktaiIP.php';
    $is_valid_ip = false;
    foreach ($GLOBALS['_OPENPNE_KTAI_IP_LIST'] as $ktai_ip) {
        if (Net_IPv4::ipInNetwork($_SERVER[SERVER_IP_KEY], $ktai_ip)) {
            $is_valid_ip = true;
            break;
        }
    }

    return $is_valid_ip;
}

http://trac.openpne.jp/browser/OpenPNE/trunk/webapp/lib/ktaiIP.php
http://trac.openpne.jp/browser/OpenPNE/trunk/webapp/lib/ktaiIP.php

SERVER_IP_KEYは、プロキシ入ってるなどREMOTE_ADDRで正しいIPが取れない場合に、HTTP_X_FORWARDED_FOR から取得させるため、定数に設定します。
http://trac.openpne.jp/browser/OpenPNE/trunk/config.php.sample

MVCの構成が云々、というのは気にしないならば、
IP帯域リスト $GLOBALS['_OPENPNE_KTAI_IP_LIST'] が含まれるktaiIP.phpIPv4.phpを読み込める状態にして、
 $isIP = is_ktai_ip();
と書くだけで、携帯IPかどうかtrue/false で返ってきます。

IP帯域リストの取得方法

上記紹介した2つの方法とも、
 「これが携帯のIPアドレス帯域である」というリスト(配列)が必要になります。


IPアドレス帯域は、各携帯電話会社のホームページ上で公開されています。
その情報からIP一覧のリストを作り、アクセス元のIPと照合すればいいだけ
・・・なのですが。


問題は、この提供IPアドレス帯域。
時々、変わったり追加されるのです。
アプリ側で全IPを網羅していないと、一部ユーザさんが「エラーでアクセスできない」状況が発生してしまいます。


これをどうやって更新していくか。


案1)「ホームページからリアルタイムでIP帯域リスト抽出して、随時リスト作成」
例:[Utility.php] 携帯電話を判別する。IPアドレスから。【確定版】 | 株式会社オルタ
「ホームページが落ちてたらどうなるの?」
「たまにチェックするだけならいいけど、頻繁だと負荷が・・・」


案2)「定期的にホームページから情報を自動抽出して、リストを自動更新する」
「ホームページの内容やパターン、公開ページが変わりました、とかでノイズが入ったりしないか?」
「自動更新だと、そういう不具合を見落とし易くなる」


案3)「ホームページから自動抽出した情報を受け取って、チェックして手動でリスト更新」
「でもそれだと、情報更新遅くなるよね。少なくとも自動更新(リアルタイム)よりは」
「あと、入力ミスとかで反映間違いするかも」


「それに、今までの方法って全部、
 ホームページ更新とかで、情報全部取れなくなった場合、巡回アプリ直さなきゃダメなんだよね」


案4)「サイト巡回ソフトでIP帯域情報ページを監視しておいて、更新されたら確認しに行って手動で直す?」
「アナログだなおいっ!!(笑)」


で、結論申し上げますと、
案1〜4のどれにするかは、みなさん各々の、方針と好みで決めて下さい ^^;


ちなみに、案3)が一般的っぽいです。ホームページ確認&抽出用のソースが、公開されています。
DSAS開発者の部屋:携帯ゲートウェイのIPアドレス帯更新を効率的に確認する方法 perl
http://d.hatena.ne.jp/tomisima/20070903/1188836400 Python