• ベストアンサー

初歩的な質問 セッション管理について

hogehoge78の回答

回答No.6

■フローに関して 若干誤解があるようです。 記述するプログラム中でCookieを診断はしてません。 プログラムで判断するフローは、 ・セッションが引かれているか ↓ ・引かれていた場合、セッション変数に値が残っているので値をチェック($_SESSION['time']のことです。私の書いたものはセッション変数が惹かれているかははしょってあります) ↓ ・セッションが引かれていないか、セッションの有効期限が過ぎている場合、ログアウト(またはログアウト画面へのリダイレクト)処理(上記セッションがそもそも引かれていない場合どうするかの診断もはしょってあります) という流れです。有効期限について、 (1)Cookieというセッションとは別物のクライアントにのこるファイルの有効期限 (2)サーバにのこるセッションのファイルの有効期限 (3)プログラムで制御したいセッションというものの有効期限 と、有効期限は三種類あるわけですが、 (1)は書き換え可能なので、不正な有効期限のものが送りつけられてくる上に、PHP上でセッションを閉じても(session_destroy)してもCookieの有効期限が残っていればCookieは削除されないので、セッションを閉じる際に同時にCookieも強制的に削除する必要があります。 (2)これは、session_destroyするか、session.gc_maxlifetimeに到達して且つ、GC(ガベージコレクト)が発動した場合に削除されます。 http://monolog.spanstyle.com/2005/07/session.html こちらにGCについて詳しく書いてありましたが、つまるところ、一定確率でGCが発動するので、GCが発動しなければ残っている可能性があるものです。 (3)そうすると(1)と(2)がプログラム中で、自分で意図した有効期限外でもログイン中としてプログラムが動いてしまう場合があります。 そこで、セッション変数にログイン日時を与えてやって、有効期限を確認し、有効期限外だったらプログラムから両方のファイルを削除してやる必要があります。 <?php if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy(); ?> ここの処理のくだりは既に「このセッションは有効でないからログアウトすることに決定」という判断がされた後の記述ですので、判断を行っている場所ではないです。単純にCookieとセッションを削除するための記述です。 if(isset($_COOKIE[session_name()])) これは、$_COOKIE変数に、そのキーが存在するかの有無を単純にチェックしているだけです。存在していたら削除する、というだけで、それ以外に意図はないです。どうしても気になるのであれば、 <?php setcookie(session_name(), '', time()-42000, '/'); session_destroy(); ?> とだけ記述しても削除されます。ただし、今後docomoのようにCookieを保存できない端末で利用するように環境を変更した場合、ログアウトの時に無駄な処理(Cookieが使えないのにsetcookieを行う)が発生しますね。

march4
質問者

補足

プログラムで判断するフローは、 >・セッションが引かれているか >私の書いたものはセッション変数が惹かれているかははしょってあります プログラムのフローの中には、 「セッションがひかれているか」を確認する処理は 書かれてはいないが、これは実際には必要で、 その処理は、ここでは「はしょられている」という理解でよろしいですか。 session_start(); が正常に宣言されているかどうか、 これが、つまり、セッションが引かれているかどうか、 と同じ意味なのですよね? セッションを引く = session_start(); と私は解釈しています。 で、このsession_start();が、問題なく宣言できたかどうかを判定する処理が必要なわけですね。 (hogehoge78さんが書いて下さったソースの中では、はしょられている、ということですよね。) この判定の仕方については、自分で調べますね! >・セッションが引かれていないか、セッションの有効期限が過ぎている場合(、ログアウト) if($max < time()){~(ログアウト処理)~ ということですよね。 /*---------------- 有効期限について、 (1)「セッションとは別物」の「クライアントにのこるCookieというファイル」の有効期限 (2)サーバにのこる、セッションファイルの有効期限 (3)プログラムで制御したいセッションというものの有効期限 ----------------*/ >と、有効期限は三種類あるわけですが、 (2)と(3)の違いが、私の中で明確ではありませんでした。 そして、現在も、若干、混同しています。苦笑 おかげさまで、(1)はOK。 >(1)はPHP上でセッションを閉じても(session_destroy)しても Cookieの有効期限が残っていればCookieは削除されないので フローを再確認 ----------------★★★------------------------- ・session_start(); ・セッションファイルがランダム名でサーバ側に作成されます。 ・その中に適宜、セッション変数のデータが入れられます。 ・そのデータ(あれ?!データではなく、セッションファイルと、かな?!)と1対1対応で結びついている照合証のようなものが、クライアント側に渡されているクッキーファイルのクッキー値です。 ・セッションを閉じるとは、サーバ側に置かれているセッションファイルを削除することです。 /* セッションファイルと、その中の値であるセッション変数? の関係がよく分かっていない気がします!汗 */ //-------↓ by 某サイト ↓------ ・ただし、セッションファイルを削除しても、メモリ内には、セッション変数とその値が残っているので、これを削除してから、session_destroy()する必要があります。 よって、 $_SESSION = array(); session_destroy(); のような方法で処理する方が良い。 (私が誤解していたら、爆死です。) //------↑ by 某サイト ↑------ で、 >Cookieの有効期限が残っていればCookieは削除されないので、 setcookie(session_name(), '', time()-42000, '/'); にて、クッキーも削除する必要がある、と。 つまり、 セッションを閉じる場合には、その下準備がいくつか必要なのでしょうか? (A)まず、メモリ内のセッション変数とその格納値をarray()等で削除 (B)次に、クッキーファイルの有効期限をマイナス化 (C)ようやく、session_destroy(); (A)の過程は、(B)をするのであれば、必要ない処理でしょうか? それと、 「セッションが閉じられても、クッキーの有効期限が残っている場合」とは、どんな場合なのでしょう。 閉じたはずのセッションが、また使われてしまいかねない状況なのでしょうか? /* 分からないことだらけで、すみません。 でも、ようやく核心部分に辿り着けたような気がしています。 */ ----------------★★★------------------------- >(2)これは、session_destroyするか、session.gc_maxlifetimeに到達して且つ、GC(ガベージコレクト)が発動した場合に削除されます。 http://monolog.spanstyle.com/2005/07/session.html 実は、このサイトを予め読んだ上で、本質問をしたのでした。笑 なので、その内容については、概ね理解できているものと思って頂いて結構です。 >ここの処理のくだりは~(中略)~それ以外に意図はないです。 こういった、プログラムの背景について説明頂けると、とても分かりやすいですね^^ 助かります。 >ただし、今後docomoのようにCookieを保存できない端末で~(中略)~無駄な処理が発生しますね。 ここも同様に助かります。 if文を挟むことで、プログラムの汎用性が高まるわけですね。

関連するQ&A

  • ■(ログイン)セッションの有効期限の設定法について

    いつも、お世話になっております。(PHP5.2.5) セッションの有効期限の設定方法について色々調べましたが、 解決できなかったため、質問いたします。 --- 例えば、 a.phpと、b.php、2つのスクリプトファイルからなるサイトにおいて、 a.php、b.phpどちらにおいても、スクリプトソース冒頭で、 //(1)サーバ側のセッションファイルの有効期限を(少なくとも)24時間に設定 //有効期限が過ぎた後は、ある一定の確率でGCが起動しファイルを削除 ini_set('session.gc_maxlifetime', 86400); //(2)クライアント側のクッキーファイルの有効期限を24時間に設定 session_set_cookie_params(86400,"/"); //(3)セッションIDを生成、付与 session_start(); とし、 さらに、その上で、 IDとパスワードの入力に成功した場合に、 ログインさせ、その状態をセッション値に入れます $_SESSION['login'] = 'login'; --- 以上の経路をたどった場合の「ログイン持続期間」は、 24時間となると私は考えていますが、違いますでしょうか? しかし、実際には、1時間も持ちません。 (ちょくちょくサイトにアクセスしていると、1時間以上持つようなのですが。 ※つまり、期限が更新(延長)されているんでしょうかね。) で、どうして意図した通りに動かないのかを調べようと、 firefoxにて、クッキーの有効期限を確認すると、 (2)の処理がうまくいっているせいか、 こちらの有効期限は意図通りに設定されています。 よって、意図通りに機能しない原因は、 サーバ側のセッションファイルの有効期限が うまく設定されていないからなのでは、と思っています。 つまり、(1)の処理がうまく出来ていないことが予想されます。 はてさて、どこに問題があるのか…。 また、このサイトの例において、 もし仮に私の意図した通りの設計となった場合には、 アクセスの度に、その有効期限を24時間延長するような処理になるのでしょうか? 以上、どなたかどうかアドバイスを宜しくお願い致します。 --- なお、 セッション値に「time()」を格納し、 その時間をもとに、ログイン期限を設定し、 ログイン時からの経過時間と、その期限とを比較して、 ログイン状態を継続(延長更新?)させるか、切断するかを毎回判断させる、 なんていう方法もありそうですが、 その場合にしても、 結局は、サーバ側のセッションファイルの有効期限の持ちが悪ければ、 同様に、うまくいかないはずだと私は考えています。

    • 締切済み
    • PHP
  • 自動ログアウト

    ログインページを作っていまして、時間が経つと自動的にログアウトするようなページを考えています。 セッションのタイムアウト時間の変更はini_set関数でsession.gc_maxlifetimeの値を変更すればいいことがわかりましたが、上手く動作しません。 他に何か設定しなければいけないのでしょうか。 よろしくお願いします。 //テストのため、10秒後にタイムアウト ini_set("session.gc_maxlifetime","10");          ・          ・          ・ session_start();

    • 締切済み
    • PHP
  • セッション時間について

    プログラム初心者です コアサーバーとゆうレンタルサーバーを使っています。 phpの設置しているディレクトリに自前のphp.iniを置けば反映されるらしいです セッション切れの時間をのばす方法を教えてください(自前でphp.iniを作る方法を教えてください) サーバーのphpinfo確認したら session.cookie_lifetime 0 0 session.gc_maxlifetime 1440 1440 になっていました 自前のphp.iniにsession.gc_maxlifetime = 3600と一行だけ記述するだけでできますか? それとも、php.iniにxamppにあるような設定をワラワラ書かないといけませんか? php.iniのパーミッションは何にしたほうがいいでしょうか?見えるとまずいですよね? よろしくお願いします  

    • ベストアンサー
    • PHP
  • セッションファイルの有効期限ですが、

    セッションファイルの有効期限ですが、 phpのデフォルトでは session.gc_maxlifetimeが1440、 session.gc_probabilityが1のようなんですが、 これだとローカル環境で確認したところ、 2日くらい前のセッションファイルでもサーバ側に残っています。 いくらsession_regenerate_id(true)とかやっても、いきなり画面を閉じたりすると このように残ってしまうのですが、デフォルトの設定のままだと危険ではないでしょうか? また、ためしに設定を session.gc_maxlifetimeを5、 session.gc_probabilityを100に変えてみたところ、 古いセッションファイルはすぐに削除されましたが、 最新のものだけはなぜか残り続けました。 セッションファイルの削除はどのように実装されていますか?(特に画面をいきなり閉じられた場合の対策) また、session.gc_maxlifetime、session.gc_probabilityのデフォルト値は変更していますでしょうか? さらに、サーバ側のセッションファイルさえ破棄してしまえば、クライアントのセッションクッキーは残っていても別に問題ないと思うのですが、どうでしょう? ちなみに私のPHPバージョンはwindows版の5.2.4です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • セッションのタイムアウト管理

    サーバー側で20分間アクセスのなかったセッションを 強制的に切断したいと考えています。 まずphp_value session.gc_maxlifetime等に有効期限を設定して、 ガベージコレクションでセッションIDファイルを削除する方法ですが、 今回の要件としては、サーバー側で20分後に確実にセッションを 切りたいので、1/100の確率とかでは困ります。 そこで、php_value session.gc_divisorを1にして 1/1の確率でセッションIDファイルを削除させたりしても良いのでしょうか? そもそもデフォルトで1/100の確率で削除としているのには1/1にしては 駄目な特別な理由があるのでしょうか? それと、別案として、セッションIDをサーバー側のDBか何かに保持して、 セッションIDファイル(SESS_*)の最終更新日から20分を過ぎている ファイルに対してunlinkで物理削除してしまう方法も検討しています。 この方法は何か問題あるでしょうか? 以上。宜しくお願いします。  

    • ベストアンサー
    • PHP
  • PHPでセッションが切れない

    いつもお世話になります。 現在、練習用として管理画面を作成しています。 session.gc_maxlifetime=1440(24分)で設定しているのですが、一時間以上放置してもセッションが切れません。。 session.gc_maxlifetime以外に何か設定が必要なのでしょうか? PHPのバージョンは5.3.3になります。

    • 締切済み
    • PHP
  • セッションを保持する時間を確定する関数ってあるのでしょうか?

    タイトル通りなのですが、PHPでセッションを保持する時間を確定する関数ってあるのでしょうか? 検索すると、php.iniのsession.gc_maxlifetimeを指定すれば可能のようですが、PHPファイルにセッションの保持時間を違う物に指定したい場面がありますので、使用できません。 ここでは1時間、ここでは2時間、というようにPHP文中で指定する関数というのはありますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • WEBのクッキーとセッションは、クライアント側で変更できるのでしょうか?

    クッキーとセッションについて教えてください。 (例として使用している言語はphpです。) オートログイン機能用に、IDとパスワードの情報をクライアント側のクッキーに保存してもらい、 指定のサイトをブラウザで開いたらクッキーから情報を読み込み、 該当したらログイン用のセッションにサイトに入れるフラグを入れるとします(たとえば$_SESSION["login"]="on")。 この場合、セッションの[login]の値が"on"なら、ログインできるのですが、 ブラウザ自体の機能やUNIXのプログラム等にセッションの値自体を変更する何かしらの方法があり、 IDとパスワードをしらなくてもセッションの[login]を"on"にしてログインされてしまうということはあるのでしょうか? また、今回の処理でクッキーを読み込む際、変数に一度格納している(例:$id=$_COOKIE["id"])のですが、 この場合でも、別ドメインのサイトに行った際IDやパスワードがログとして表示されてしまうのでしょうか? (セッションは別ドメインのサイトにリンクした際、飛び先のドメインでも並文としてログが表示されてしまうらしいので) 教えていただけるようお願いします。

  • Weblogicのセッションについて

    Weblogic10.0.3にてWebアプリケーションの 開発を行っていますが、解決しない問題があり 質問させていただきます。 現在、ログイン画面にてユーザーIDとパスワードを 入力してログイン後各処理を行うアプリを開発していますが、 ログイン時のユーザー情報をセッションに保持する作りに していますが、ログイン時にjsessionidがURLに 表示されてしまいます。 (例:http://testserver:9000/TestApp/Test.do;jsessionid=vFqyK3xMrJ9QCLJnW0X0r2w17ylBVhhD2VQT4qGwdMsGvhnZHdJQ!-425034523) 一度ログインするとそのブラウザを閉じるまでは、画面遷移をしても 何度ログイン・ログアウト処理(セッションの生成・削除)を 行っても二度と表示されません。 (画面遷移はStrutsで制御しています) セッションIDをCookieに保持する方法もあるようですが、 なるべくCookieを使いたくないので、セッションに保持するように したいのです。 web.xml、weblogic.xml、Weblogicサーバーの設定などで セッションIDを表示しなくなる方法がありましたら 教えてください。よろしくお願いします。

  • セッションについて

    php初心者&ど素人です 勉強のためにphpとmysqlで簡単なログイン機能を作ってみようと思いました しかし、Locationでページ移動したときのセッションがセキュリティ的に安全なのかわかりません ログインフォームのlogin.phpから自分自身に送信、ログインできたらセッションを付けてから header("Location:hoge.php");でhoge.phpに飛ばしています ログインした後のhoge.phpページではログイン確認をセッションidがあるかだけ確認しています セッションidがなかったらログインページ戻す if(!$_SESSION['id']){ header('Location: login.php'); exit(); } 質問1 セッションidは表示されている誰でも見れるidなのでセキュリティ的にまずいですか? 簡単にセッションのっとれるもんなんでしょうか? 質問2 一般的にはどうやているのでしょうか? ログインページ全て(例えば編集画面とか会員情報とか)にmysqlから暗号化されたパスワードを取得して、それをセクションに入れて、また、mysqlからパスワードと照合したりしてるんでしょうか? よろしくお願いします

    • ベストアンサー
    • PHP