質問: 再度質問。。。 前回ご協力いただきましたユーザー様、誠にありがとうございます。 色々ためした結果、思うように動作できなかったので、 再度自分の頭をリセットする意味で質問させていただきます。 ### 現在の各ページのコード ↓各ページの冒頭記述↓ ``` ※※※※ ここからhtmlコード ``` ### ログアウトphpコード ``` ※※※※ ここからhtmlコード ``` ### 補足事項 php.iniファイルはあるが、特に設定はしておりません。 →設定していない理由は、現在wordpressを使用して自社サイトを持っており、 wordpressもログイン画面があるが、一定操作が行われなかったら自動ログアウトになるため、 php.iniファイルは特に触っておりません。 むしろ、php.iniはあまり関係ない?と思っております。 php.iniを設定しなくても自動ログアウトコードは作れるのでは?と感じています。 上記記述しているphpコード(ログイン画面等)はwordpressとは関係ない別ディレクトリに作成しています。 →理由としては、wordpressに影響しない完全なるシステムページを作るため。 ### できなかったこと ``` ini_set( 'session.gc_maxlifetime', 60 ); // 秒(デフォルト:1440) ``` の時間設定を行っても、自動ログアウトなりませんでした。 また、試しにphp.iniにも「session.gc_maxlifetime」を設定してもうまく動作できず。 さらに、今現在はissetの中を「$_SESSION["USERID"]」に設定しておりますが、$_SESSION['LOGIN_INFO']にすると、 ``` ようこそ=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん ``` のUSERIDが表示もされず「ようこそさん」になります。 ### 質問したいこと 1上記を踏まえてphp.iniの設定は必要なのか? 2時間設定の仕方は間違っているのか? 2-1.時間設定はクッキー?セッション?両方を削除しないと動作されない仕様なのか? 3むしろif分岐がそもそも間違って動作されているのか? セッション及びクッキーの設定がいまいち理解できていないので、教えていただきたいです。 長文になりましたが、ご教授願います。 どうぞよろしくお願い致します。
回答: phpのセッション管理はちょっと分かりにくいですよね。 私も学生時代混乱しました。 > > 1上記を踏まえてphp.iniの設定は必要なのか? > > > 必要です。 session.gc_maxlifetimeはログイン有効時間以上にする必要があります。 > > 2時間設定の仕方は間違っているのか? > > > 間違ってはいません。 ただ、ブラウザのクッキー有効期限を間違えている可能性があります。 > > 2-1.時間設定はクッキー?セッション?両方を削除しないと動作されない仕様なのか? > > > どちらかを消せば非ログイン状態となります。 セッションファイルの削除はphpに任せ、session_destroy()を実行するだけでokです(なのでファイルが残る場合もあります)。 問題はクッキーの有効期限です。 一般的にこちらを削除して(有効期限を設定して)、ログイン/非ログイン状態としています。 beginner_39さんが書かれたコードの中で、セッションを生成するときにsetcookie()という関数を実行しているところがあるはずです。 ``` setcookie("test", $sessionId, time() + 3600); ``` この第3引数がクッキーの有効期限で、上の例では1時間にしています。 クッキーが残っている=サーバに渡すセッションIDがあるため、ログイン判定可能としているわけです。 > > 3むしろif分岐がそもそも間違って動作されているのか? > > > 間違っていませんが、USERIDだけでは不十分です。 ユーザがクッキーを直接書き換えてセッションIDを偽装した場合、ログインできてしまう可能性があるからです。 最終ログイン時間もセッションに入れておき、ログイン有効期限内か判定してあげましょう。 ``` if (!isset($_SESSION["USERID"]) and time() - $_SESSION["LAST_LOGIN"] > 3600) { //ログアウト処理 exit; } ``` まとめると、基本的なログイン状態の判定は3つの要素で行われます。 * セッションファイル * クッキー * 最終ログイン時間 最終ログイン時間は最終アクセス時間としてもokです。