実際に動いてすぐ使える「PHPによるかんたんログインサンプル」を作ってみました
ログインが必要なケータイサイトではほぼ必須となる、端末情報を使った「かんたんログイン」ですが、Web上にはあまり良い情報がないようです。
そこで、実際に動いてすぐ使えるような、PHPによる3キャリア対応かんたんログインのサンプルプログラムを作ってみました。
※かんたんログイン機能は、セキュリティ上の危険が指摘されています。
ご利用には十分お気をつけください。
(コメント欄に補足事項を記載しておきますので参考にしてください)
サンプルの機能
ログイン画面、 新規登録画面、 ログイン後(マイページ)画面



かんたんログインとは?
プログラムを紹介する前に、かんたんログインについて軽く説明します。
かんたんログインとは、ケータイ端末から契約情報や製造番号をサイトに送信し、それを使ってログインするプログラムの総称です。
ユーザ名やメールアドレス、パスワードなどを入力せずワンタッチでログインできますので、文字が打つのが大変なケータイ環境ではとても重宝されます。
今回は端末情報として、「ドコモ:iモードID、au:EZ番号、ソフトバンク:x-jphone-uid」を使って認証を行います。
各種端末IDについては、以前書いたこちらの記事で詳しく説明しています。
→ ke-tai.org ケータイの端末ID・ユーザIDの取得についてまとめてみました [ke-tai.org]
動作条件と設置の流れ
動作に必要な条件:
- PHP 5系が動くこと
- MySQLが動くこと
- .htaccessが動くこと
※DB接続にはPDO、端末情報の取得にはPEAR::Net_UserAgent_Mobileを利用しています。
※.htaccessはケータイからのセッションを使うためとアクセス元制限に利用しています。
設置の流れとしては次の通りです。
- プログラム一式をダウンロードする
- MySQLにデータベース「login_db」を作成する
- 「users.sql」を元にテーブル「users」を作成する
- プログラム一式をアップロードする
- PEARのNet_UserAgent_Mobileが入っていないのであればインストールもしくはアップロードする
かんたんログインサンプルの設置
1. プログラム一式をダウンロードします
こちらからダウンロードしてください。
→ ke-tai.org かんたんログイン サンプルプログラム (ver1.0) [ke-tai.org]
2. MySQLにデータベース「login_db」を作成します
3. テーブル「users」を作成します。
作成方法はあまりに基礎的な内容のためここでは紹介しません。
不慣れな方はphpMyAdmin上から作ると便利でしょう。
4. プログラムをアップロードします
設置は次のように行います。
設置先は仮で「login」フォルダとします。必要に応じて適宜変更してください。
login/
├ .htaccess ケータイからセッションを使うための設定ファイル
├ common.php 共通関数
├ login.html ログイン画面テンプレートHTML
├ login.php ログイン画面PHP
├ mypage.html マイページテンプレートHTML
├ mypage.php マイページPHP
├ new.html 新規登録テンプレートHTML
├ new.php 新規登録PHP
├ users.sql テーブル作成用SQL(※こちらはアップの必要はありません)
└ Net PEAR::Net_UserAgent_Mobile(※インストールされてない場合のみ)
└ UserAgent [以下略]
PEAR::Net_UserAgent_Mobileは、サーバにインストールを行います。
レンタルサーバなどでインストール出来ない場合は、こちらからダウンロードを行い、上記(loginフォルダの下にNet/UserAgent/・・・)のようにアップロードします。
→ PEAR Net_UserAgent_Mobile Download [pear.php.net]
5. パスワードを変更する
データベースに接続するユーザ名、パスワードはデフォルトでroot:rootになっています。
common.phpの以下の部分(44行目付近)を環境に合わせて変更してください。
/**
* DB接続
*
* データベースに接続する
*
* @return class PDO接続クラス
*/
function dbConnect()
{
// データベースの設定
$db_host = 'localhost'; // 接続サーバ
$db_name = 'login_db'; // 接続DB名
$db_user = 'root'; // 接続ユーザ名
$db_pass = 'root'; // 接続パスワード
6. 動作確認を行う
ケータイからアップロードしたサイトの「login/login.php」にアクセスすれば、かんたんログイン登録が行えるはずです。
※PCからはアクセスできません。
※端末ID通知がオフの場合は登録できません。
プログラム解説
キモとなるのは端末のユーザID取得とセッション管理の部分だけです。
端末ユーザIDの取得は次のようにして行っています。
この情報は個人情報となりますので、暗号化して格納した上で方が良いでしょう。
($salt_stringの値には必要に応じてランダムな文字列をセットしてください)
/**
* ユーザID取得
*
* ケータイのユーザID(契約に紐付くID)を取得する
*
* @return string ユーザID文字列
*/
function getPhoneUserId()
{
// PEAR::Net_UserAgent_Mobileの読み込み
require_once('Net/UserAgent/Mobile.php');
// インスタンスを生成
$agent = Net_UserAgent_Mobile::singleton();
// ユーザID取得
$uid = $agent->getUID();
// 暗号化
if ($uid != '') {
$salt = 'salt_string';
$uid = md5($uid . $salt);
}
return $uid;
}
なお、かんたんログイン機能で最も重要なのは、ケータイからのみアクセスを許可することです。(PCからの接続は不可とする)
PCからだと端末ユーザIDはいくらでも詐称できてしまいます。
必ずケータイからのみアクセス許可としましょう。
アクセス制限は.htaccess内で行っていますが、簡易版となっています。
各キャリアのページや下記のページを参考にして、常に最新のキャリアIPアドレス帯域を指定することをオススメします。
→ ke-tai.org ケータイキャリア・クローラIPアドレス [ke-tai.org]
※追記
可能であるなら上記のアクセス制限に加え、接続元IPアドレスとユーザエージェントを照らし合わせ、同一キャリアであることも確認した方がより良いようです。詳しくはコメント欄をご覧ください。
セッションに関しては、上記で取得したユーザIDをセッション変数に格納することでログイン状態としています。
ケータイからセッションを維持するため、.htaccessで次のように設定しています。
php_flag session.use_trans_sid On php_flag session.use_cookies On
セッションに関してはセキュリティ上の問題も絡みますので、ここでは詳しく解説しませんが、下記の記事(コメント欄も参考になります)を参照してください。
→ ke-tai.org PHPでケータイからセッションを使う場合の設定方法 [ke-tai.org]
その他
- 本プログラムはかんたんログインの学習用を目的とした簡易的なものとなっています。必要に応じて機能を追加しご利用ください。(こちらではこれ以上の機能追加の予定はありません)
- プログラムに不備がありましたら、すぐ修正しますのでご指摘ください。
- お問い合わせ・サポートは原則いたしませんが、フォーラムに書き込むと回答が得られるかもしれません。
- 重要と思われる情報は下記コメント欄に転載するようにします。あわせてご覧の上でご利用ください。
関連:

携帯サイト年鑑2010
ブックレビュー:ユーザー視点でつくる 携帯サイト制作の基礎知識
ブックレビュー:mixiアプリをつくろう!OpenSocialで学ぶソーシャルアプリ
Ruby on Rails携帯サイト開発技法
Linux-DB システム構築/運用入門
携帯サイト制作 WEBデザインの新しいルール
ケータイHTMLコンパクトリファレンス
札幌のケータイ開発、Web開発なら

8月 1st, 2009 at 23:22:35
[...] ke-tai.org > Blog Archive > 実際に動いてすぐ使える「PHPによるかんたんログインサンプル」を作ってみました ke-tai.org > Blog Archive > 実際に動いてすぐ使える「PHPによるかんたんログ [...]
8月 2nd, 2009 at 1:04:20
[...] 実際に動いてすぐ使えるPHP製「かんたんログイン」のサンプルプログラム [...]
8月 5th, 2009 at 21:04:06
こちらのブログでご指摘いただきました。
http://www.tokumaru.org/d/20090805.html#p01
現在は停止されているケータイ上からのJavaScript経由でのアクセスや、ケータイ用とされているIPアドレス帯域から、万が一ケータイ以外からのアクセスがあった場合に備え、接続元IPアドレスとユーザエージェントを照らし合わせ、同一キャリアであることも確認した方がより良いとのことです。
上記ブログは参考になりますので、ぜひ読んでみるとよいと思います。
8月 8th, 2009 at 16:20:32
こちらのスクリプトでは、MD5で暗号化したユーザIDをキーにしてDBからユーザ情報を取り出しているようですが、
MD5ハッシュというものは一意であることが保証されていないのではないでしょうか?
8月 10th, 2009 at 14:57:58
yetさん
コメントありがとうございます。
確かにおっしゃるとおりですね。ユーザ数が十分いる場合、確率は低いですが他人がログインできてしまう可能性があるかもしれません。
これは問題ですので、対処したいと思います。
例えばiモードIDは7桁の英数字([0-9A-Za-z]{7})なので、saltを加味しなければ、重ならない可能性も高いかもしれないですね。
確率を検証してみる必要がありそうです。
いずれにしても平文でIDを持つのは避けたほうが良いと思われますので、別のアルゴリズムを使うのが良策でしょうか。
オススメのアルゴリズムや対処方がありましたら教えてください。
ご指摘ありがとうございました。
8月 11th, 2009 at 7:43:21
matsui様
ご回答ありがとうございます。
正直申しまして、私も別のアルゴリズムは思いつきません。
現実には、平文で保存するか、かんたんログインを諦めるかの二択になるのではないでしょうか。
ネットショップが顧客の住所氏名を暗号化して持つわけにいかないのと同様に、運営者が責任を持ってユーザIDを管理し、ユーザも信頼できるサイトでのみかんたんログインを利用する、という形が現実的(というか現状?)に思えます。
4月 19th, 2010 at 12:47:45
参考URL
http://ke-tai.org/blog/2010/03/25/kantandnsrebindingcheck/
http://ke-tai.org/blog/2009/11/26/imode20security/
http://takagi-hiromitsu.jp/diary/20100221.html
http://takagi-hiromitsu.jp/diary/20100415.html
5月 24th, 2010 at 20:19:14
参考URL追加
http://www.hash-c.co.jp/info/2010052401.html
5月 25th, 2010 at 21:35:08
更に追加します。こちらわかりやすい資料ですね。
http://www.hash-c.co.jp/archive/wasf2010.html
7月 17th, 2010 at 21:53:37
[...] [...]