- ベストアンサー
初歩的な質問 セッション管理について
セッション処理をしたいと考えていますが、 分からない点が多く困っています。 したいと思っていることは、「ログイン」的な処理です。 訪問者がブラウザを閉じても、サイト設計者が設定した「期間」、 ログイン状態をキープさせておけるような仕様です。 ※よくあるタイプです。 (特段、難しいことや変わったことをしようとしてはいません。) ただ、ちょっと変わっている点は、ログインはパスワード無しで行います。 フォーム(POST)でボタンをクリックしたら、誰でもログインできるようなものです。 で、上記処理をする方法として、大きく分けて、 (1)クッキー($_COOKIE)を使う方法と、 (2)セッション($_SESSION)を使う方法とがあるように思っています。 (1)の方法だと、 データそのものをクライアント側に保存させるのでセキュリティ上、やや難があり、 (2)の方法だと、「キー(セッションID)」だけをやりとりするので比較的安全、 ということをよく耳にします。 ただ、パスワードを扱うわけではないので、この場合には、 (1)の方法でもアリな気がしています。 しかし、今後、パスワード形式に移行しないとも限らないので、 (2)を使った方法で話を進めたいと思います。 パスワードのやりとりがないのなら、(1)の方が断然楽でいいよ~ ということであれば、話は変わってきます。 その場合には教えて下さい。 (※質問文の中で、私は随所に変なことを言っている可能性がありますので、 適宜、ご指摘頂けると嬉しく思います。) 話を戻しまして、 ここからは、前述の(2)の方法で話を続けさせて頂きます。 セッション処理の流れについてですが、 セッションIDをクライアントに送りつけ、保存させる方法は、 session_start()をスクリプト先頭に書き、 $_SESSION['login'] = 'おまえはもう、ログインしてる…。'; と、どこかに書くことで、 この$_SESSION['login']値を保持している間、訪問者は、 サイト内のページを、ログインされた状態として閲覧できる と、私は考えています。 何か変なことを言っていましたら、ご指摘下さい。(★ポイント1) //----------------------------------- 次に、セッション保持期間の設定の方法についてですが、 ネット上で調べた所、 ini_set("session.gc_maxlifetime", "1440"); のように設定できると書いてありました。 このini_set()による設定が、どう作用するのか、 この点もよく分からずにいます。(★ポイント2) session.gc_maxlifetimeの設定自体は、スクリプト終了とともに、 Master Valueに戻されるようですが(PHPマニュアルより)、 私が気になっているのは、 そのスクリプトで生成したセッションの保持期間は、どうなっているのか? ということです。 ちょっと乱暴な書き方をしますが、 例えば、 php.ini上(つまり、Master Valueの設定値)では、 session.gc_maxlifetime:1440 というような設定 の場合に、 スクリプトAの中で、 ini_set("session.gc_maxlifetime", "~仮に24時間としておきます~"); のように書き、 そのあとに、 $_SESSION['login'] = 'おまえはもう、ログインしてる…。'; と書いた場合、 クライアントには、$_SESSION['login']のデータは24時間保持される、 ということでしょうか。 つまり、 スクリプト内に書いた、 ini_set("session.gc_maxlifetime", "~仮に24時間としておきます~"); という記述は、 そのスクリプトでセッションIDをクライアントに与える場合の「そのセッションIDの保持期間」のみ を設定できる、という理解でよろしいでしょうか。 当たり前のことをお聞きしているかもしれませんが、 どなたか、どうか、よろしくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (6)
- hogehoge78
- ベストアンサー率80% (433/539)
- hogehoge78
- ベストアンサー率80% (433/539)
- hogehoge78
- ベストアンサー率80% (433/539)
- hogehoge78
- ベストアンサー率80% (433/539)
- kaze2com
- ベストアンサー率50% (6/12)
関連する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
- セッション時間について
プログラム初心者です コアサーバーとゆうレンタルサーバーを使っています。 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
補足
>SESSIONを使うといっても基本的にはCookieも使っている この仕組みは、頭に入っていましたが、 $_SESSIONの有効期限を決めるということが、 $_COOKIEの有効期限を決めることと同じこと、 ということが、頭の中で整理されていませんでした。 よって、この点の理解は、私にとってかなり大きな収穫と言えます。 頂いた回答の中盤以降は私にはやや難解でした。汗 ・session_set_cookie_params()関数 →設定できる項目 (有効期限、パス、ドメイン、セキュリティ、http) これと、 ・setcookie()関数 →設定できる項目 (クッキー名、クッキー値、有効期限、パス、ドメイン、セキュリティ) が回答の中で登場しました。 私は、どちらの使用経験もありません。 >こちらの、session_set_cookie_params関数を使って、 >cookieの生存時間を設定すれば良いですね。 生存時間(有効時間)を決める場合、 上記両関数、どちらでも可能であるように感じましたが、 ここで、session_set_cookie_params関数の方を選ばれたことには、 何か根拠はあるのでしょうか。 >cookieが削除されてしまえば、 >ユーザがサーバに残されているIDを照合出来なくなるので、 >自動的にログアウトされます。 ここについては、理解OKです。 >ただ、cookieはクライアント側にファイルとして記録されておりますので、 >ユーザが書き直す場合が当然あります。 サーバがクライアントへ送ったものとは違ったものに、 クライアント側で書き換えてしまわれると、 有効期限内のクッキーであったものでも、 「別物」に変えられてしまうために、 IDの照合ができなくなるわけですよね。 >そこで、多重でチェックする意味で、ログインが発生したタイミングで、 >セッション変数に、ログインされた時間を記録 えっと・・・。 サーバさんが、アクセスしてきたクライアントさんに対し、 「あなたは、あの時のあの人だよね」 という照合をする際の照合方法を2重にしておく、という理解でよろしいでしょうか。 (もちろん、ここでの2重システムにするしないについては任意である、 ということなのでしょうが、hogehoge78さんの書かれたこの2重のソースについて 詳しく知りたいと思いますので、ここでは突っ込んで質問を続けます。) で、その2重というのは、 ・最初に書かれていた、$_COOKIEによる方法 と、もう1つ、 ・$_SESSIONによる方法 ということですよね。 $_COOKIE値が書き換えられてしまう可能性をカバーするために、 $_SESSIONも利用しておく、という感じでしょうか。 ただ、ここで疑問なのは、$_SESSIONも結局は、COOKIEを利用している、 ということでしたので、$_SESSIONによってクライアントに送りつけたセッションIDは、 クライアント側で書き換えられたりしないのでしょうか。 (もちろん、され得るけれども、2重にしとけば、より堅牢だろう、ということでしょうか。) 次に、ソースについて。 気になった箇所がいくつかあります。 (1) //---------------------------- if (isset($_COOKIE[session_name()])) { //---------------------------- session_name()は、デフォルトでは、「PHPSESSID」のようですが、 これは、通常、このままの値で使っていて良いものなのでしょうか。 (セキュリティ上、変更しておいた方が良かったりしますか?) 現在、私はセッションIDと、セッション名が頭の中でこんがらがっています。汗 両者の関係が、掴めそうで掴めないのです。。 >$_COOKIE[session_name()] また、↑これがどういうことをしようとしているのかについても、 理解できないでいます。。涙 $_COOKIE[]に、session_name()が入っている?! つまり、デフォルトでは、 $_COOKIE[PHPSESSID]こういう感じなんでしょうけど、 コレは一体、なんぞや?!(苦笑←重症) (2) //---------------------------- setcookie(session_name(), '', time()-42000, '/'); } //---------------------------- >time()-42000 ここの「-42000」という値は、マイナス値であれば何でも良いんでしょうか? 42000という数字に何か意味はありますでしょうか。 マイナスの時間に設定することで、クッキーを削除する、 ということをしようとしているのかな、なんて思っていますが。 またしても、長い補足で、お手数をお掛けします。。^^;