質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20813questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

php 自動ログアウトについて その2

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,232

beginner_39

score 67

再度質問。。。
前回ご協力いただきましたユーザー様、誠にありがとうございます。

色々ためした結果、思うように動作できなかったので、
再度自分の頭をリセットする意味で質問させていただきます。

現在の各ページのコード

↓各ページの冒頭記述↓

<?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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2017/09/20 13:18

    プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)

    キャンセル

  • beginner_39

    2017/09/20 13:21

    mts10806様 ご指摘ありがとうございます。修正させていただきました。

    キャンセル

  • mts10806

    2017/09/20 13:21

    「質問したいこと」が書いてないように思います。聞きたいことを明記してください。また「思うように動作できなかった」とは何が起きたのでしょうか?「○○となるはずだ(△△したい)けど、××のようになった」という形で記載してください。

    キャンセル

  • beginner_39

    2017/09/20 13:34

    mts10806様 お騒がせしました。自分も現在頭の中が整理できずうまく質問ができないでおりますが、少しづつ整理して修正させていただきました。よろしくお願いいたします。

    キャンセル

回答 2

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です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/20 16:45 編集

    ooeok様
    お忙しい中、貴重な時間を割いてご回答いただき大変感謝申し上げます。
    とても丁寧なご回答で少しづつ整理ができそうです!

    ご回答いただきましたが、追加のご質問です。

    ※※※※※※
    setcookie("test", $sessionId, time() + 3600);
    ※※※※※※

    のような「setcookie」の記述を探してみたのですが、記述がありませんでした。
    もしない場合は、ログアウトphpに記述した方がいいのでしょうか?
    それとも各ページごとに記述した方がいいのでしょうか?

    キャンセル

  • 2017/09/20 17:01 編集

    それでは、ログイン処理にこんな記述はありませんか?

    ・ setrawcookie()
    ・ header("Set-Cookie: session_id=***");

    クッキーを使っているならこの手の記述があるはずです。

    キャンセル

  • 2017/09/20 17:25

    ooeok様
    見当たらなかったです。
    今回作成したログインシステムはネットにある文言を使用しながら作りました。。。
    もしかしたらcookieそのものの設定ができていないのかもしれないと感じました。

    不正?とまではいきませんが、ミスがありすぎるプログラムになっているかもしれません。
    少し見直します。。

    ちなみにですが、教えていただきました
    「setcookie("test", $sessionId, time() + 3600);」のような記述は基本的にはどのページに記載するのが正しいのでしょうか?

    キャンセル

  • 2017/09/20 17:56

    ということは、session_start()で暗黙的にcookieを使ってるようですね。
    php.iniのsession.cookie_lifetimeがクッキーの有効期限になります。
    session_start()で勝手にクッキーを設定してくれるので、ログイン時にsetcookie()は必要ありません。
    ログイン時には、ログイン(アクセス)時間だけセッションに入れておけばokです。

    setcookie()はログアウト時にクッキーを破棄するのに使います。
    session_destroy()の前に入れましょう。

    setcookie(session_name(), '', time() - 42000);
    session_destroy();

    キャンセル

  • 2017/09/20 18:17

    ooeok様
    自動ログアウト設定、できました!とても感謝です!ありがとうございます!

    最後に2点ほど確認させていただきたいのですが、
    ①ログイン時には、ログイン(アクセス)時間だけセッションに入れておけばokです。
    →セッションに入れておくというのはどのようなことでしょうか?

    ②session.cookie_lifetimeを設定したら動作できました。
    ちなみに下記3つの記述も必要になってくるのでしょうか?
    そのまま記述してた方が良いのでしょうか?
    session.gc_maxlifetime
    session.gc_probability
    session.gc_divisor

    キャンセル

  • 2017/09/20 21:20

    プログラムとしては以下のように書くだけです。

    $_SESSION["LAST_LOGIN"] = time();

    gc_probabilityやgc_divisorなどはデフォルトがあるので、必要なければ特に設定する必要はありません。

    http://php.net/manual/ja/session.configuration.php

    キャンセル

  • 2017/09/21 10:12

    ooeok様
    いろいろと大変助かりました!いただいたURLを参照させていただき、勉強させていただきます。
    今回はお時間を割いていただき誠にありがとうございました。
    取り急ぎ、お礼までのコメント。

    キャンセル

-3

確か、PHPにおけるphp.iniでのセッションのガーベージコレクト設定って、設定した時間が来たら必ず破棄されるわけじゃないっすよ。
実行時設定

gc_maxlifetimeに設定した時間で破棄対象になることはなるんですが、その判断タイミングが誰かのセッション開始なので、誰もアクセスしてこないとサーバーには永遠に残ってます。

で、gc_probabilityが破棄確率分子でデフォルトが1、gc_divisorが破棄確率の分母なのですが、こいつはデフォルトが100で、つまり、上記破棄タイミングにデフォルトでは100分の1の確率で破棄される、という仕様だったと思います。

だからまぁ、gc_divisorを1に設定したら、時間が来て誰かがセッションを開始した時確実に破棄されることになるのかなぁ? やったこと無いですけど。

誰かがアクセスしてくるまでは一生セッション残ってる仕様のはずなので、確実にサーバーから消すにはそれこそ、cron走らせて定期的にセッションを開始するのがいいのかな。

あとはまぁ妥協策として$_SESSIONに前回アクセス時刻を保持しておいて、プログラム的に時間を超えていたら強制的にdestroyしてログアウトですね。結局、誰かがアクセスしてくるまでは一生セッション残ってますけど。

たしか、そんな感じのはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

関連した質問

  • 解決済

    PHPとMySQLについて

    ](fadebad2fd9a28a1fd4d1ebd714c7f9b.png) 今、PHPとMySQLを使った認証システムを作成しているのですが、ここで質問があります。

  • 解決済

    会員制サイト:メールアドレスでログイン

    前提・実現したいこと Qiita:PHPとMySQLで新規登録とログインを実装する(PDO使用)を参考に、PHPで会員制サイトを作っています。 このサイトで作れるものでは、ID

  • 解決済

    PHPセッションCookie

    いつもお世話になっています。 数ある投稿の中ありがとうございます。 さて、早速本題に入らせていただきますが、私はPHP初心者でまだサンプルコードなどを参考にしながら勉強をしているも

  • 解決済

    phpが表示するカスタムフィールドのデータが重複します。

    現状 カスタム投稿に次のようなケーキの投稿があります。 これがやりたい 今回やりたいのは『カスタム投稿のカスタムフィールドを一覧する固定ページを作りたい』ということです。

  • 解決済

    php 自動ログアウトについて

    自動セッションログアウトについてご質問です 管理画面にて、一定の操作等が行われなかった際、 自動的にログアウトさせる方法を教えていただきたいです。 現在、 ログイン画面 ログイ

  • 解決済

    wordpress「コメントは承認待ちです」の場所の変更をしたい。

    困っている事 wordpressで自作テーマを作成しております。 ブログのコメントでつまづきこの場を借りて質問させていただきます。 コメントを承認制にし「あなたのコメントは承認

  • 解決済

    「スラッグ」+「文字列」で<a>タグに入れる方法

    ■やりたいこと wordpressでスラッグと文字列をつなげて、リンク化する方法を探しています。具体的には、 ➀表示中のページのスラッグ(aaa)を取得して、 ➡「aaa」

  • 解決済

    投稿一覧ページにページネーション機能をつけたい。

    現在、Wordpressで投稿一覧ページを作成しております。テーマはすべて自作で作っております。 1ページあたりの最大表示件数は4件で、それを超えたら2ページ目、それを超えたら3ペ

同じタグがついた質問を見る

  • PHP

    20813questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。