キャリアIPのチェック
携帯のかんたんログインではパソコンなどでヘッダを偽装してログインページにアクセスされると、認証を通してしまうことがありますので、アクセス元のIPアドレスを取得して携帯キャリアのものか判断する必要があります。
携帯キャリアのIPアドレスの帯域は各キャリアのページで公開されていますので、IP アドレスとネットマスクに関する処理を行うライブラリNet_IPv4を利用してアクセス元のIPアドレスがキャリアのものかチェックするメソッドを作成します。
Net_IPv4の主なメソッドは以下の通りです。
メソッド名 | 意味 |
ipInNetwork( string $piaddress, string $network ) | IPアドレスが指定されたネットワーク内にあるか判定する |
validateIP( string $piaddress ) | IPアドレスの書式を検証する |
validateNetmask ( string $netmask ) | ネットマスクの書式を返称する |
parseAddress ( string $address ) | アドレス/ネットマスクの組み合わせ(CIDR アドレス)をパースする |
各キャリアのIPアドレスの帯域は以下のURLで公開されています。
アクセス元のIPアドレスは環境変数「$_SERVER['REMOTE_ADDR']」で取得できます。
携帯キャリアごとのIPアドレス帯域をconfig.php内に設定しておき、Net_IPv4::ipInNetworkメソッドでチェックします。
$docomo_ip = array( '210.153.84.0/24', '210.136.161.0/24', # 略 );
/** * コンストラクタ */ function Util(){ // 設定ファイル読み込み include('config.php'); // ドコモのIPアドレス帯域 $this->docomo_ip = $docomo_ip; # 略 } /** * ドコモのIPアドレスかを判定 * * @return true / false */ function isDocomo() { foreach($this->docomo_ip as $k=>$v){ if(Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $v)){ return true; } } return false; }
同様にソフトバンクモバイル、auのIPアドレスかチェックするメソッドを作成します。
かんたんログインのメソッドに上記で作成したメソッドを追加します。
/** * かんたんログイン */ function easyLogin($uid){ $util = new Util(); // キャリアのIPかチェック if(!$util->isDocomo() && !$util->isSoftbank() && !$util->isAu()) return false;
かんたんログインのメソッドが呼ばれた際にアクセス元のIPアドレスが携帯キャリアのものかチェックし、携帯キャリア以外のIPアドレスは認証しません。
キャリアのIPアドレス帯域は追加、変更されることもありますので、プログラム内でキャリアのIPアドレス帯域を利用する際には必ず各キャリアのサイトで確認してください。
サンプルでは携帯キャリアのIP帯域をチェックする処理を入れています。
ですが、携帯電話からの端末IDの送信、プログラムでの端末IDの取得は携帯ベンダの仕様にも依存するところがあり、完全に安全に利用できるとは言えないのが実情です。
携帯電話端末によっては端末の脆弱性を利用されて、ユーザーの意図しない動作が行われることがあることをキャリアも認めています。
- 作ろうiモード:iモードブラウザ(NTTドコモ)
- ブラウザのセキュリティ設定に関する重要なお知らせ(ソフトバンクモバイル)
このような動作を起こす場合もあることを理解した上で、安全対策とともに実装する等、十分に注意した上で利用して下さい。