• ベストアンサー

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

hogehoge78の回答

回答No.7

■セッションが引かれているかどうか これの意図するところは、会員サイトなので、IDとパスなどの認証が通っているかどうかをチェックするという意味合いです。 <?php session_start(); if(isset($_SESSION['user_id'])){ /* 例えば認証が通ってログインしたら、セッション変数にユーザのIDを格納しておくとか。セッション変数にuser_idがセットされてなければ、認証が通ってないということで、画面が遷移しないようにする。 */ } ?> ここらへんの実装は、ここで掘り下げなくても、理解されていますね。 ■(2)と(3)の違い COOKIEにセッションIDが残ってて、ブラウザがソレを通知してきたタイミングで、gc_maxlifetimeに到達はしているものの、GCが発動していなかった場合、ログイン後の遷移が行われてしまう可能性がありますので、プログラム側で、明示的にチェックしてやる必要があると思われます。 ■セッションファイルと、その中の値であるセッション変数の関係 セッションファイルというのは、(ファイルベースの)データベースです。 実際に明示的に記述することはあまりないかもしれませんが、 http://php.nfsi.pt/manual/ja/function.session-write-close.php session_write_closeという関数があり、セッションファイルに$_SESSION変数で保持した値を(セッションファイルに)書き込んで閉じます。これは、session_startをしていれば、スクリプト終了後に自動的に呼ばれるものです。 SQLなデータベースであれば、INSERT文やUPDATE文で行うようなことを、自動的にやってくれてるわけです。 で、session_destroyというのは、セッションを閉じるのではなくて削除します。DELETE文でテーブルやレコードを削除するのに近いですね。 ■(A)の過程は、(B)をするのであれば、必要ない処理なのか session_destroyしても、$_SESSION変数はunsetされるわけではないですので、session_destroy関数が叩かれた後も、$_SESSION変数に値が残ってますので、 $_SESSION = array(); として、リセットしたほうが良いかと思います。 ■セッションが閉じられても、クッキーの有効期限が残っている場合 サーバ側にセッションが残ってないので、クッキーの有効期限が残っていても認証がされてしまうことはないと思いますが、ブラウザから無駄な通信が行われることもありますし、それ以外の何らかの予期せぬ出来事があるかも分かりませんので、削除したほうが良いのではないでしょうか。 大体のことが分かったら、後はオープンソースのログイン認証が行われるアプリケーションなどの実装を見てみるとノウハウ的な部分は分かると思います。 ECCUBE、WordPress、XOOPS、などなど。 他にも、 http://www.ideaxidea.com/archives/2007/11/phpphpuserclass.html こちらで紹介されているようなユーザ認証部分だけのクラスライブラリなどもあったりします。

march4
質問者

補足

>■セッションが引かれているかどうか 理解しました! >(2) GCの、 セッションファイルの削除 に使われる確率の設定具合 によって、 有効期限を迎えているにも関わらず、 存在し続けているセッションファイルを、 チェックする必要があるわけですよね。 ここ、完璧に理解できたと思います^^ >(3) で、これは、 セッション変数の中に格納する値でもってコントロールする、 セッションの有効期限、 という感じですかね。 セッションファイルの有効期限ではなく、 セッションファイルの中の1データに、 有効期限を意味するデータを格納している、 という感じで理解しました。 恐らく、ちゃんと理解できていると思います。笑 この(3)における、「有効期限」は、 (1)(2)とは異なり、その値は、一意的ですよね。 (1)は、書き換えられる可能性がある (2)は、GC頼み という意味で、それぞれ、一意的とは言い難いですから。 >セッションファイルというのは、(ファイルベースの)データベースです。 セッションファイルと、その中に書かれているデータは別物なんですよね。 セッションIDの名前にプレフィックスがくっついて、 セッションファイル名になり、 そのファイルの中のデータが、 セッション変数に格納した値であり、 そのセッションファイルとクライアントを 1対1対応で結びつける際に使う技術がクッキーで、 その対応関係を照合するのに、 $_COOKIE['セッション名']にて、セッションIDを呼び出す方法を取る、 ということなのですよね。 セッション関連の動的な構成要素は、 ・セッションファイル名、 ・セッションID、 ・セッション名、 ・セッション変数(連想配列)のインデックス値 ・セッション変数(連想配列)の値 こんな感じでしょうか。 なんだか、すごく分かりにくい構造をしていたのですね。 最初から、セッションという概念はややこしいものだろうなと直感していたので、質問がかなり後回しになっていました。 (クラスより後になりました。) おかげさまで、今、ようやく分かりつつあります。 >session_destroyしても、$_SESSION変数はunsetされるわけではない >session_destroy関数が叩かれた後も、$_SESSION変数に値が残ってます >リセットしたほうが良いかと 了解です。 では、(A)(B)(C)、 全てセットで、基本は、行っていこうと思います。 >サーバ側にセッションが残ってないので、クッキーの有効期限が残っていても認証がされてしまうことはないと思いますが、 えっと、 session_destroy()後、 セッションファイルは消されますよね、 ということは、セッションIDもなくなりますね、 なので、 クッキーがクライアントで生き続けていたとしても、 $_COOKIE['セッション名']で呼び出される値である、 セッションIDは、既に削除済みなわけですから、 そのクッキーは事実上、無効なものであるけれども、 クッキーそのものの存在自体はまだあるわけだから、 予測不能な振る舞いをする可能性があり、 それを断つ意味で、クッキーの有効期限も無くしてやった方が良い、というわけで、 クッキーの有効期限にマイナス値を設定し、 クッキーに消滅してもらうわけですね。 つながってきました! >大体のことが分かったら、後はオープンソースのログイン認証が行われるアプリケーションなどの実装を見てみるとノウハウ的な部分は分かると思います。 ですね^^ 分かる部分が多くなってきましたので、 それを呼び水に、さらに多くのことを吸収していけそうな気がしています。 セッションファイル蓄積による、サーバ圧迫が どの程度、処理速度に悪影響をもたらすか等の、 より発展的なことがらについては、 おいおい調べていけたらと思います。 >ECCUBE、WordPress、XOOPS、などなど。 過去、XOOPSを使った経験があるので、 古巣に立ち返ってみます。笑 当時、プログラミングのプの字も知らなかったので、 XOOPSの中に組み込まれている数々のphpファイルを 私は全く理解することができませんでしたが、 今なら、きっと理解できるはずです! >ユーザ認証部分だけのクラスライブラリなども こちらも、じっくり読ませて頂きますね^^ ひとまず、セッションについては9割くらい理解できたものと思います。(強気 笑) すべて、hogehoge78さんのおかげです。 いつも、ありがとうございます。

関連する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