メイン 一般的な話題(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: 携帯電話のセッションに関して 情報、ありがとうございます!
|
| スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
| 投稿するにはまず登録を | |



