.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
14 人のユーザが現在オンラインです。 (14 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 14

もっと...

.
.リンク集

メイン
   一般的な話題(General)
     携帯電話のセッションに関して
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
vert
投稿日時: 2008-1-30 5:44
Baker スタート
登録日: 2008-1-30
居住地:
投稿: 4
携帯電話のセッションに関して
携帯コンテンツを作っております。

ログイン後、ログイン済みユーザーとしてセッションにIDが記入され、ユーザー名が表示される動きを実現させたいのですが、なぜかdocomoの携帯においてのみ、挙動がおかしくなります。

1.ログイン後、最初はエラー、次にログインを試みると、成功し、セッションにIDが記入される。

2.しかし、そのページを更新するとログイン情報が消滅する。

PHPSESSIDの値は変わっていなく、セッション情報も書き加えられますが、更新すると、すべてのセッション情報が消えてしまうようです。

以下スクリプトになります。

ログイン部

function login_check($controller="user",$action="login",$status=""){
$loginarray=$this->UserLogin->find(array('utn'=>$this->Mobile->getUtn()));

if(!empty($loginarray)){
$this->Session->write("login.id",$loginarray['UserLogin']['user_id']);
$this->redirect($controller."/".$action,$status);
}else{
$this->redirect($controller."/".$action);
}
}

getUtn()は、携帯における個体識別番号の取得です。こちらは問題ありません。ログイン後のcontrollerおよびactionを引数にして、トップページにリダイレクトさせております。

リダイレクトは以下のとおりです。

function redirect($url,$status=null){
if(isset($this->params['url'][MY_SESSION_POST_NAME])){
$session=$this->params['url'][MY_SESSION_POST_NAME];
}elseif(isset($this->params['form'][MY_SESSION_POST_NAME])){
$session=$this->params['form'][MY_SESSION_POST_NAME];
}else{ $session=session_id();
}
$url .= sprintf("?%s=%s"
,MY_SESSION_POST_NAME
,$session);
parent::redirect($url,$status);
}

共通コントローラーに以下のとおりの記述をしております。

function __construct()
{
define('MY_CAKE_NO_COOKIE', 1);
parent::__construct();
}
function beforeFilter(){
if($this->Session->read('login.id')){
$this->myuserarray=$this->User->find(array('id'=>$this->Session->read('login.id')));
$this->set("myuserarray",$this->myuserarray);
}
parent::beforeFilter();

}

以上は、

http://d.hatena.ne.jp/hetima/20070201/1170313526

こちらのサイトを参考にいたしました。Session Fixation対策は後回しにしています。

databaseを使うログインも試しましたが、まったく同じ結果、

サーバーのsessionにかかわる設定は以下のとおりです。

Session Support enabled
Registered save handlers files user
Registered serializer handlers php php_binary wddx

Directive Local Value Master Value
session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php/session /var/lib/php/session
session.serialize_handler php php
session.use_cookies Off Off
session.use_only_cookies Off Off
session.use_trans_sid 0 0


こちらはPCにおいてのミラーサイトでは完全に期待通りの動作をし(use_cookiesをOFFにしていても)、またサーバー内において

session_start();、session_id()を使ったセッションのテストも期待通りの動きをします。

auto_start,use_trans_sidなど用いても、結果は同じでした。

もし同じ壁に当たった方、いらっしゃいましたら、解説お願いいたします。

以上、よろしくお願いいたします。
vert
投稿日時: 2008-1-30 8:00
Baker スタート
登録日: 2008-1-30
居住地:
投稿: 4
Re: 携帯電話のセッションに関して
自己解決できました。参考になったのは以下のサイトです。

http://q.hatena.ne.jp/1196724348

セッションハイジャッキングの対策の為、USER_AGENTによるvalidateをしているようです。

個体識別はドコモの場合、USER_AGENTに追加されますので、別エージェントとみなされ、セッションハイジャッキングととられてしまうようです。

それを行っているのはCakeSessionクラスの_checkValidメソッドおよびvalidメソッドの二つになります。これらを、エージェントがドコモの場合のみスルーする、というように書き換えることで、一応の解決としました。

携帯サイト用に使用される方も多いと思います。はまったら参考にしてください。
shun
投稿日時: 2008-1-30 11:53
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: 携帯電話のセッションに関して
情報、ありがとうございます!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .