CakePHPで携帯サイトを作る - ログインページ(1)の続きです。
ログイン処理のサンプルです。
Index
ログイン用ビュー作成
PCサイト用のログイン画面のビュー(app/views/login/index.ctp)を作成します。
携帯サイト用のログイン画面のビュー(app/mobile_views/login/index.ctp)を作成します。
-
<?php
-
<div>
-
<form method="post" action="<?php echo $this->webroot; ?>login" enctype="application/x-www-form-urlencoded">
-
ユーザーID<br />
-
<input name="data[User][username]" type="text" maxlength="128" value="" id="UserUsername" /><br />
-
パスワード<br />
-
<input type="password" name="data[User][password]" value="" id="UserPassword" /><br />
-
<input type="submit" value="ログイン" />
-
</form>
-
</div>
-
?>
携帯サイト用の簡単ログイン用のビューも作成します。
ログイン用コントローラー作成
Authコンポーネントを利用したかったのですが・・・。
ログインの処理は、単純なものにします。
-
class LoginController extends AppController
-
{
-
function _login()
-
{
-
$username = $this->data['User']['username'];
-
$password = $this->data['User']['password'];
-
-
$ret = $this->User->checkLogin($username,$password);
-
if ($ret !== false) {
-
$sess_data[SESS_USER_ID] = $ret['id'];
-
$sess_data[SESS_USER_ROW] = $ret;
-
$this->Session->write(SESS_AUTH_INFO,$sess_data);
-
$this->redirectPage($this->webroot);
-
}
-
return $ret;
-
}
-
-
function index()
-
{
-
if ($this->isLogin()) {
-
$this->set('already_login',true);
-
return;
-
}
-
-
if ($_SERVER["REQUEST_METHOD"] == "POST") {
-
if (!$this->_login()) {
-
$this->set('login_fail',true);
-
}
-
}
-
}
-
-
function easy()
-
{
-
if (!IS_MOBILE) {
-
$this->redirect($this->webroot . 'login');
-
return;
-
}
-
-
if ($this->isLogin()) {
-
$this->set('already_login',true);
-
return;
-
}
-
-
if (!MOBILE_SERIAL_NUMBER) {
-
$this->set('empty_serial_number',true);
-
return;
-
}
-
// サンプルなので端末IDのみで行を取得。予定としては端末IDとキャリア名(docomo,au,softbankなど)で検索する。
-
$row = $this->User->findBySerialNumber(MOBILE_SERIAL_NUMBER);
-
$this->set('not_found',true);
-
return;
-
}
-
$this->set('unset_easy_logon',true);
-
return;
-
}
-
-
$sess_data[SESS_USER_ID] = $row['User']['id'];
-
$sess_data[SESS_USER_ROW] = $row['User'];
-
$this->Session->write(SESS_AUTH_INFO,$sess_data);
-
$this->redirectPage($this->webroot);
-
}
-
}
携帯から接続しているユーザーの端末IDチェック
携帯から接続したユーザーがログイン後、自分のプロフィールなどを見るページ・変更するページなどに遷移するときは、端末IDを送信してもらうことにします。
送信してもらった端末IDとログイン時にデータベースから取得してセッションに記憶した端末IDと比較します。
それが違ったら、不正とし、再ログインを促すページへ移動するようにします。
-
function checkLoginMobileId($redirect=true)
-
{
-
if (IS_MOBILE == false) {
-
return true;// 携帯端末からの接続でない
-
}
-
if (!MOBILE_SERIAL_NUMBER) {
-
// 端末IDを取得できていない
-
if ($redirect) {
-
$this->redirectPage($this->webroot . 'sorry/number');
-
}
-
return false;
-
}
-
$s = $this->Session->read(SESS_AUTH_INFO);
-
// ログインした情報がセッションにない
-
if ($redirect) {
-
$this->redirectPage($this->webroot . 'login');
-
}
-
return false;
-
}
-
if (MOBILE_SERIAL_NUMBER != $s[SESS_USER_ROW]['serial_number']) {
-
$this->log('セッション内の端末IDと取得できた端末IDが違う');
-
$this->Session->delete(SESS_AUTH_INFO);
-
if ($redirect) {
-
$this->redirectPage($this->webroot . 'sorry/relogin');
-
}
-
return false;
-
}
-
return true;
-
}
セキュリティに関して
特に携帯用のページを表示する場合、追加のセキュリティ対策が必要です。
このサンプルでは、ドコモの携帯端末から接続されていると判断した場合、セッションIDをURLに付加するようにしています。
URLを見るとセッションIDがわかります。
なんらかの方法でセッションIDを取得した人は、そのセッションIDを付与されているユーザーになりすませます。
なりすましによる被害を防ぐため、本サンプルでは、携帯から接続しているユーザーの端末IDチェックをしています。
しかし、端末IDを偽装できるならば、端末IDのチェックだけでは不十分です。
他人にセッションIDを知られないとしても、このサンプルの簡単ログインを有効にしている場合、偽装した端末IDがあれば、その端末IDをもつユーザーになりすましてログインできてしまうのです。
端末IDをチェックする他に、IPアドレスでキャリアを制限するなどの複数のセキュリティ対策を施す必要があります。
PCサイトも必要に応じて、不正防止策を追加する必要があります。
ブラウザ表示サンプル
Firefoxで接続すると、ログイン後のトップページは、次のような表示となります。

iモードHTMLシミュレータⅡの場合は、次のような表示です。

シミュレータ以外にドコモとソフトバンクの実機で表示を確認しています。
auの実機では表示を確認していません。
ダウンロード
アーカイブへのリンクを「ダウンロード(「CakePHPで携帯サイトを作る」のサンプル)」に移動しました(2009/02/11)。
リンク(携帯サイトのセキュリティ関連)
携帯サイトのセキュリティに言及しているサイトへのリンクです。参考にさせていただきました。
- 徳丸浩の日記 - 書籍「PHP×携帯サイト デベロッパーズバイブル」の脆弱性
- memokami :: 「PHP x 携帯サイト デベロッパーズバイブル」の脆弱性に関して
- -OASIS- - 今日のメモ「携帯におけるセッションとセキュリティ(PHP)」
- ke-tai.org > Blog Archive > PHPでケータイからセッションを使う場合の設定方法
- 携帯端末IDのはなし - ueblog
- 携帯業界の認証事情 Part2 - y-kawazの日記