>> i's SQUARE >> Webサービス構築ガイド >> 携帯からのアクセスかどうかを判別する方法

携帯からのアクセスかどうかを判別する方法

「IPアドレス帯域による判別」、 「ホスト名による判別」、 「ユーザーエージェントによる判別」 の3種類を以下に紹介します。
これらの方法を組み合わせたり、 精度やメンテの手間を考えて自分のサイトに合う方法で実装します。



■IPアドレス帯域による判別

IPアドレスで携帯かどうかを判定します。
IPアドレスは偽造が出来ないので、完璧に判定することが可能ですが、 各携帯キャリアのIPアドレスに変更・追加があった場合、そのたびにメンテが必要になります。
各携帯キャリアが使用しているIPアドレスの帯域は、公式サイトで公開されてます。

▼各キャリアが公開しているIPアドレス帯域
iモードセンタのIPアドレス帯域
EZサーバのIPアドレス帯域
ソフトバンク携帯IPアドレス帯域について

【例】ドコモの 210.153.84.0/24 の場合、

サブネットマスクが24bitなので、ホストアドレスは1〜254まで利用可能です。
つまり、利用できるホストアドレスは「210.153.84.1〜210.153.84.254」となり、これにマッチするか調べます。

マッチするかは以下の様に2進数に変換して正規表現を利用すれば簡単に記述できます。
11010010.10011001.01010100.[01]{1,8}

もし、サブネットが/26の場合は以下の正規表現で表せます。
11010010.10011001.01010100.11[01]{1,6}


■ホスト名による判別

リモートホスト名で携帯かどうかを判定します。
リモートホスト名も偽装できないため精度が高く、かつお手軽です。

▼ドコモのホスト名
・***.docomo.ne.jp

▼auのホスト名
・***.ezweb.ne.jp

▼ソフトバンクのホスト名
・***.jp-c.ne.jp
・***.jp-d.ne.jp
・***.jp-h.ne.jp
・***.jp-k.ne.jp
・***.jp-n.ne.jp
・***.jp-q.ne.jp
・***.jp-r.ne.jp
・***.jp-s.ne.jp
・***.jp-t.ne.jp

【例】ホスト名による判別のサンプルプログラム(Perl):

$host = $ENV{'REMOTE_HOST'};

if    ($host =~ /.+docomo\.ne\.jp$/){

}elsif($host =~ /.+jp-.\.ne\.jp$/)  {

}elsif($host =~ /.+ezweb\.ne\.jp$/) {

}


■ユーザーエージェントによる判別

ユーザーエージェントを利用して携帯かどうかを判別します。
尚、ユーザーエージェントは任意に設定できるものなので、偽造は防げませんが、一番お手軽な判別方法として広く利用されています。
各携帯キャリアのユーザーエージェントは、公式サイトで公開されてます。

▼各キャリアが公開しているユーザーエージェント
ドコモ
AU
SoftBank

ユーザーエージェントは、 ドコモの場合「DoCoMo」、 auの場合「UP.Browser」、 ソフトバンクの場合「J-PHONE」、「Vodafone」、「SoftBank」という文字が含まれてますので、これでキャリア判別を行います。
ただし、ソフトバンク携帯にも「UP.Browser」という文字が入っている機種がありますので「先頭の文字が何で始まるか」で判別します。

【例】ユーザーエージェントによる判別のサンプルプログラム(Perl):

$agent = $ENV{'HTTP_USER_AGENT'};

if    ($agent =~ /^DoCoMo/){

}elsif($agent =~ /^J-PHONE|^Vodafone|^SoftBank/){

}elsif($agent =~ /^UP.Browser|^KDDI/){

}
【例】ユーザーエージェントによる判別のサンプルプログラム(PHP):

$agent = $_SERVER['HTTP_USER_AGENT'];

if      (ereg("^DoCoMo", $agent)){

}else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){

}else if(ereg("^UP.Browser|^KDDI", $agent)){

}
あと、携帯独自の環境変数を利用して判別する事も可能です。
例えば、ソフトバンク携帯はx-jphone-msnameで機種名が取得できますので、
Perlの場合 $ENV{'HTTP_X_JPHONE_MSNAME'}
PHPの場合 $_SERVER{'HTTP_X_JPHONE_MSNAME'}
で機種名が取得できているかどうかを調べる事で判別出来ます。



設計者が、設計以上のものを製造者に求める分野なんてあるはずがないじゃないか
by プログラマーの格言