php 自動ログアウトについて その2
- 評価
- クリップ 0
- VIEW 4,959
再度質問。。。
前回ご協力いただきましたユーザー様、誠にありがとうございます。
色々ためした結果、思うように動作できなかったので、
再度自分の頭をリセットする意味で質問させていただきます。
現在の各ページのコード
↓各ページの冒頭記述↓
<?php require 'password.php';
session_start();
// ログイン状態のチェック
if (!isset($_SESSION["USERID"])) {
header("Location: logout.php");
exit;
}
?>
※※※※
ここからhtmlコード
ログアウトphpコード
<?php
session_start();
if (isset($_SESSION["USERID"])) {
$errorMessage = "ログアウトしました。";
}else{
$errorMessage = "ログイン情報を確認し、ログインしてください。";
}
session_destroy();
?>
※※※※
ここから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']にすると、
<p>ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん</p>
のUSERIDが表示もされず「ようこそさん」になります。
質問したいこと
①上記を踏まえてphp.iniの設定は必要なのか?
②時間設定の仕方は間違っているのか?
②-1.時間設定はクッキー?セッション?両方を削除しないと動作されない仕様なのか?
③むしろif分岐がそもそも間違って動作されているのか?
セッション及びクッキーの設定がいまいち理解できていないので、教えていただきたいです。
長文になりましたが、ご教授願います。
どうぞよろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
phpのセッション管理はちょっと分かりにくいですよね。
私も学生時代混乱しました。
①上記を踏まえてphp.iniの設定は必要なのか?
必要です。
session.gc_maxlifetimeはログイン有効時間以上にする必要があります。
②時間設定の仕方は間違っているのか?
間違ってはいません。
ただ、ブラウザのクッキー有効期限を間違えている可能性があります。
②-1.時間設定はクッキー?セッション?両方を削除しないと動作されない仕様なのか?
どちらかを消せば非ログイン状態となります。
セッションファイルの削除はphpに任せ、session_destroy()を実行するだけでokです(なのでファイルが残る場合もあります)。
問題はクッキーの有効期限です。
一般的にこちらを削除して(有効期限を設定して)、ログイン/非ログイン状態としています。
beginner_39さんが書かれたコードの中で、セッションを生成するときにsetcookie()という関数を実行しているところがあるはずです。
setcookie("test", $sessionId, time() + 3600);
この第3引数がクッキーの有効期限で、上の例では1時間にしています。
クッキーが残っている=サーバに渡すセッションIDがあるため、ログイン判定可能としているわけです。
③むしろif分岐がそもそも間違って動作されているのか?
間違っていませんが、USERIDだけでは不十分です。
ユーザがクッキーを直接書き換えてセッションIDを偽装した場合、ログインできてしまう可能性があるからです。
最終ログイン時間もセッションに入れておき、ログイン有効期限内か判定してあげましょう。
if (!isset($_SESSION["USERID"]) and time() - $_SESSION["LAST_LOGIN"] > 3600) {
//ログアウト処理
exit;
}
まとめると、基本的なログイン状態の判定は3つの要素で行われます。
- セッションファイル
- クッキー
- 最終ログイン時間
最終ログイン時間は最終アクセス時間としてもokです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-3
確か、PHPにおけるphp.iniでのセッションのガーベージコレクト設定って、設定した時間が来たら必ず破棄されるわけじゃないっすよ。
実行時設定
gc_maxlifetimeに設定した時間で破棄対象になることはなるんですが、その判断タイミングが誰かのセッション開始なので、誰もアクセスしてこないとサーバーには永遠に残ってます。
で、gc_probabilityが破棄確率分子でデフォルトが1、gc_divisorが破棄確率の分母なのですが、こいつはデフォルトが100で、つまり、上記破棄タイミングにデフォルトでは100分の1の確率で破棄される、という仕様だったと思います。
だからまぁ、gc_divisorを1に設定したら、時間が来て誰かがセッションを開始した時確実に破棄されることになるのかなぁ? やったこと無いですけど。
誰かがアクセスしてくるまでは一生セッション残ってる仕様のはずなので、確実にサーバーから消すにはそれこそ、cron走らせて定期的にセッションを開始するのがいいのかな。
あとはまぁ妥協策として$_SESSIONに前回アクセス時刻を保持しておいて、プログラム的に時間を超えていたら強制的にdestroyしてログアウトですね。結局、誰かがアクセスしてくるまでは一生セッション残ってますけど。
たしか、そんな感じのはずです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
m.ts10806
2017/09/20 13:18
プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)
beginner_39
2017/09/20 13:21
mts10806様 ご指摘ありがとうございます。修正させていただきました。
m.ts10806
2017/09/20 13:21
「質問したいこと」が書いてないように思います。聞きたいことを明記してください。また「思うように動作できなかった」とは何が起きたのでしょうか?「○○となるはずだ(△△したい)けど、××のようになった」という形で記載してください。
beginner_39
2017/09/20 13:34
mts10806様 お騒がせしました。自分も現在頭の中が整理できずうまく質問ができないでおりますが、少しづつ整理して修正させていただきました。よろしくお願いいたします。