phpで会員制サイトの制作を勉強中です。
pdoでmysqlデータベースに接続しています。
セッションの「session_set_cookie_params」について質問ですが、
session_set_cookie_paramsで有効期限を設定する場合、
ログイン時にsession_set_cookie_paramsでセッションの有効期限を設定し、
他のページではsession_start()さえ記述すれば、
有効期限を過ぎると勝手にセッション変数のデータを空にしてくれるのでしょうか?
それとも全てのページにsession_set_cookie_paramsを書かなければならないのでしょうか?
プログラムを書いている上でセッションの動作がおかしい(有効期限が過ぎてもログアウトしない)のでsession_set_cookie_paramsの記述がおかしいのかと思い、質問しました。
また、セッション変数の有効期限を変数毎に個別に設定して削除する方法はないのでしょうか?
ご回答、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
…あー、でも
>> phpで会員制サイトの制作を勉強中です。
会員制サイトだったらセッションフィクセーション攻撃対策のため、ログイン直後の
session_regenerate_id(true);
の実行は必須であり、このタイミングで再度必ずCookieが送信されますね。だったら
session_set_cookie_params(...);
session_start();
session_regenerate_id(true);
の順番でログインするページにだけ書いておけば問題ないと思います。
ご回答ありがとうございます!
なるほど、確かによく使用するセッション関連は関数化しておいた方が賢明ですね。
また、よくよく考えるとほとんどの会員サイトはアクションがある毎にセッションの有効期限を延長していると思いますので、session_start()毎にsession_set_cookie_params()を設定した方が良さそうですね。
セッション変数の有効期限を変数毎に個別に設定して削除する方法は少しややこしそうですね…でも参考にさせて頂きます!
また、session_regenerate_id(true)についてもご指摘くださり、ありがとうございます!
No.2
- 回答日時:
以下に詳しくまとめてあります。
リクエストパラメータ・セッションに関するまとめ
http://qiita.com/mpyw/items/7852213f478e8c5a2802
>> ログイン時にsession_set_cookie_paramsでセッションの有効期限を設定し、
>> 他のページではsession_start()さえ記述すれば、
>> 有効期限を過ぎると勝手にセッション変数のデータを空にしてくれるのでしょうか?
>> それとも全てのページにsession_set_cookie_paramsを書かなければならないのでしょうか?
初めてユーザがアクセスしてくる段階で session_set_cookie_params + session_start が両方コールされれば、期待している動作になります。逆に、Cookieがセットされた2回目以降のアクセスでは session_set_cookie_params は影響を及ぼしません。
しかし、どのページでCookieが送信されるかは分かりません。送信されるのは、ユーザが「Cookieの無い状態で初めてアクセスしてきたsession_startのあるページ」となります。そのため、session_startを使用している全ての箇所にsession_set_cookie_paramsも書くべきです。私なら関数化しておきますね。
>> また、セッション変数の有効期限を変数毎に個別に設定して削除する方法はないのでしょうか?
セッションの有効期限を(有効期限を短くするほかのどれよりも)長く確保し、「前回のアクセスを記録しておくセッション変数」を定義します。2回目以降にアクセスしてきたときと比較し、その差が指定した値よりも大きければ自分でunset構文を使って削除する…という実装にするしかないですね。
No.1
- 回答日時:
ログインしてから1時間など決め打ちで有効にしたいのであれば
ログインした直後に1回セットすればいいし、
ページが遷移するたびにログイン時間を延長したいのであれば
(つまり○○分以上アクセスがないとセッションがきれる)
ページごとに書かなくてはならないでしょう
クッキーではセッションIDが管理されているので
expiresでセッションIDがクリアされてしまえば次のアクセス時に
セッションが引き継げなくなります。
またサーバー側でユーザーDBで管理しておけば
特定ユーザーから想定日時以降のアクセスがあったときに
はじくような処理は可能でしょう
ご回答ありがとうございます!
なるほど、一般的な会員制サイトは恐らく
ページ遷移ごとにログイン時間を延長してるのでしょうね。
expiresは初耳なので調べてみます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Sessionの上限について
-
一意なページを作るには
-
セッション ID とセッション名...
-
URLのパラメータをGETのままで...
-
$_SESSIONと、POSTやGETの違い
-
PHP、MySQLでチェックボックス...
-
PHP会員サイト(認証機能)
-
初歩的な質問 セッション管理に...
-
【PHP】SESSION変数の競合を...
-
Dosブロンプトでtabを出力したい
-
DTOとEntityの差は何ですか。
-
ゼロとNULLを区別して number_f...
-
Yahoo! JAPAN IDを新規取得でき...
-
excel access連携 このテーブル...
-
switch()文で値の大小比較
-
classの再定義エラーについて
-
[C#]htmlを取得できないページ...
-
【C#】DataGridViewの最大列数...
-
フォームを使わずにPOST送信す...
-
VBA コレクションに2次元配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
ログイン画面をはさんだ後、自...
-
POSTで情報を他のサーバーに渡...
-
二重ログイン管理について
-
ブラウザを閉じた後もセッショ...
-
セッションのスコープ(有効範...
-
$_SESSIONと、POSTやGETの違い
-
セッション ID とセッション名...
-
【PHP】SESSION変数の競合を...
-
クッキーを使わないセッション...
-
テーブルデータをSESSIONに保存...
-
PHP cookieの値が更新されない...
-
PHPSESSIDの表示
-
別ブラウザ間でセッションの値...
-
複数ページでセッションを使わ...
-
session_start()で生成されるセ...
-
セッションについて
-
PHP SESSION変数を複数使用でき...
-
セッション変数にパスワードを...
-
セッションのワンタイムチケッ...
おすすめ情報