PHPのセッション終了について

このQ&Aのポイント
  • PHPのセッション終了について不明な点があります。
  • セッション変数の初期化のみでは中身が消えないため、session_destroy()を実行する必要があります。
  • セッションの終了はセキュリティ上重要な処理であり、セッション情報をきちんと削除するためにはsession_destroy()を使う必要があります。
回答を見る
  • ベストアンサー

PHPのセッション終了について

PHPのセッション終了について http://c-brains.jp/blog/wsg/08/05/22-193020.php こちらのサイトでPHPを勉強しています。 セッションについてなのですが、セッションの開始と関数の働きはつかめたのですが、セッションの終了について不明な点があります。 <?php // セッションの開始 session_start(); // セッション変数の初期化 $_SESSION = array(); // セッションファイルの削除 session_destroy(); ?> この部分なのですが、セッション変数の初期化のみの記述では何がいけないのかが分かりません。 $_SESSION = array(); のみの記述で試してみたところ、$_SESSION に含まれていたキーを呼び出しても中身を出力しなかったので、ちゃんと中身は消えたと思うのですが、この場合、session_destroy()を実行する意味はあるのでしょうか? 何卒ご教授いただけますようお願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#243182
noname#243182
回答No.1

セッション処理の仕組みを把握することで、この疑問は解消します。 実行時設定がデフォルトである場合、ハンドラはファイル、パスはテンポラリディレクトリです。 http://www.php.net/manual/ja/session.configuration.php#ini.session.save-handler ご自身で準備されたテストスクリプトにブラウザを通してアクセスしながら、セッションデータが保存されるディレクトリをご覧いただくと、セッションが開始されたとき、セッションIDに紐付くデータが生成されることに気づかれるでしょう。そして、セッション変数を初期化しただけではこのデータファイルが削除されないことにも気づかれるはずです。 このように、明示的にセッションの破壊を行わない限り、サーバにデータが残った状態があるということです。セッション変数の初期化のみ行いデータを削除したつもりでも、セッションIDやセッションデータが生きていると、次のリクエストでセッション変数の内容が元通りに生成されてしまいます。 ログアウトなどの処理を実装する場合、多くのユーザはログアウト後もブラウザを開いたままであることが考えられます。そのとき、サーバ側のデータを削除することは勿論、セッションIDも削除しなければなりません。そのことを考慮した例がマニュアルに記載されています。 http://www.php.net/manual/ja/function.session-destroy.php また上記はデフォルトの設定を前提とした話ですので、独自にハンドラを実装するための関数「session_set_save_handler()」の説明をご覧になることで、さらに理解が深まるのではないでしょうか。 http://www.php.net/manual/ja/function.session-set-save-handler.php

loveone6
質問者

お礼

丁寧なご回答ありがとうございます。 確かに、セッションの初期化だけでは紐付けされたデータは削除されませんでした。 ご指摘の通りログアウト等、確実にセッション情報を削除しなければならない時に初期化だけでは不十分ですね。 初期化と削除両方が必要だと分かりました。

関連するQ&A

  • PHP SESSION変数の削除について

    PHPでブラウザを×で閉じた場合、SESSION変数 の廃棄はどうすればよいのでしょうか? ガーペジコレクション(PHP.INI等の設定)に任せておけばよいのでしょうか? ちなみにログアウトの際は下記のプロシジャを実行しています。 ----------------------------- <?php session_start(); // セッション変数を全て解除する $_SESSION = array(); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // 最終的に、セッションを破壊する session_destroy(); ?> -----------------------------

    • 締切済み
    • PHP
  • PHPセッションIDの変更

    お世話になります。 phpでのセッションIDの変更の処理(セッションの中身も初期化する)がうまくいかず困っております。 以下のようなコードでセッションの管理をしているのですが。。 現象としては、最初に発行したセッションIDを保持したクッキーが削除されていない。 下記のコードの中の2度目にsession_start()を実行している 部分の後のセッションIDを見ると 新しいIDになっているがブラウザのクッキーのセッションIDは 古いIDのまま。 という現状です。 どなたか、原因が判る方、ご教示頂ければ幸いです。 宜しくお願いします。 ------------------------------ session_start(); //セッションクッキーを破棄・ if (isset($_COOKIE[session_name()])) {   setcookie(session_name(), '',time()-42000, '/'); } //セッションを完全に破棄・ if('' != ($myid = session_id())){   $_SESSION = array(); //セッション変数を初期化・   session_destroy(); } session_id(md5(uniqid(rand(), true))); //新しいセッションID session_start(); $_SESSION['userid'] = 'hoge'; -------------------------------------------------

    • 締切済み
    • PHP
  • セッションの削除

    例えば www.hoge.com/foo/index.php で session_start(); setcookie("bar",session_id(), time()+3600); として画面遷移を行いながら登録作業を行い、 完了画面regist.php で session_start(); $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000); } session_destroy(); としましたが$_COOKIE["bar"]が初期化されません。 どのようにしたら良いでしょうか? 教えてください。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • セッション使用時のセキュリティについて

    問い合わせフォームをPHPで書いています。 基本的な流れは "1.html"(入力フォーム表示) ↓ "2.php"(入力内容を確認してもらいます) ↓ "3.php"(入力内容を送信します) です。 "1.html" フォームを表示して、入力してもらいます。 POSTでデータを2.phpに渡します。 "2.php" POSTされたデータを表示し、入力内容を確認してもらいます。 入力内容をチェックし、不備が無ければsession_start()し、$_SESSION変数に値を入れます。 "3.php" session_start()し、$_SESSION変数を使用します。 $_SESSION変数を使い終わったら、以下でセッションを破棄します。 $_SESSION=array(); session_destroy(); クライアント側のクッキーを削除します。 setcookie("PHPSESSID", '', time() - 42000, '/'); $_COOKIE=array(); 以上の手続きをしていますが、セキュリティの観点で見直した方が良い点はありますか? "2.php"の時点でセッションを開始していますが、もしその時点で送信(submit)しなければ"3.php"でのセッション削除が実行されない為、セッションとクッキーが残ってしまうと思いますが、どの様な問題が生じますか? アドバイスを宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPのセッションについて

    PHPのセッションについてお尋ねします。 1ページ目でテキストボックスに値を入力させ、ポストで送信。 2ページ目でポストを受け取り、項目が正しく入力されているかチェック。 3ページ目でMySQLに書き込み というシステムを作りかけています。 2ページ目までは上手くできたのですが、2ページ目の変数を3ページ目で渡すところで滞っています。 ザッと調べてみるとセッションというのを駆使して変数の受け渡しができるようなのですが、このセッションの書き方がよくわかりません。 session_start()を入れてみましたが、次のページには引き継がれていませんでした。更に記述が必要なのでしょうか? お詳しい方、詳説または詳説ページの紹介をお願いします。

  • SESSION受け渡し

    SESSION受け渡し 毎回大変お世話になっております。 PHP初心者なので、変な質問になっているかもしれないのですが、どうか分かる方はお付き合いください。 環境 PHP 文字コード:Shift-JIS SESSION01.php から SESSION02.php へSESSIONを受け渡した場合、統一されるはずのSESSION変数($_SESSION["name"])が2つ作成されてしまい、別々の変数として扱われてしまいます。 ・ソース SESSION01.php(SESSION送信側) <?php session_start(); $_SESSION["name"] = "1"; echo $_SESSION["name"];  ←変数の中身は[1] ?> SESSION02.php(SESSION受信側) <?php session_start(); echo $_SESSION["name"]; ←変数の中身は何も無し ?> ・SESSIONのディレクトリ sess_eo683vtfgl5qk6d2o31ghcjpn7     1KB sess_nq1cikn5uhdlnc9uvii6b8l281     0KB SESSION変数($_SESSION["name"])をSESSION01.phpとSESSION02.phpの両方で同じ変数として扱いたいのですが、別々の変数の様な扱いになっております。 なぜSESSION変数が統一されていないか分かる方がいらっしゃいましたら、どうかご意見をお聞かせください。

    • 締切済み
    • PHP
  • セッションIDがクッキーに渡るタイミングについて

    セッションIDが、クライアントPCのクッキーに書き込まれるタイミングについて、 教えてください ▼セッションを開始したとき ・session_start(); ▼セッション変数に、何かを格納したとき ・$_SESSION["HOGE"] =○○ ▼PHPの処理が終了したとき ▼セッションが終了したとき ▼それ以外

    • ベストアンサー
    • PHP
  • セッションが動かない

    セッションがちゃんと動かない。 PHPのセッションがちゃんと動きません。 他のプログラムを同じ環境で動かしたところうまく動きましたので、 コードのほうに問題があると思います。 以下のようなコードを書いています <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; まず最初はelseifのほうのプログラムを動かして、session変数に値を入れます。 その後、もう一度このファイルに飛んで、二回目はsession変数が入っているので ifのほうに入って、ifの中の処理をするという形にしたかったのですがif文のほうの処理に行きません。 ちなみに、二回目に見たときはURLの欄にセッションIDは表示されていませんでした。 テストとして <?php require_once '../function.php'; require_once '../config.php'; if (!($_SESSION['date'])) { session_start(); } connect_db() ?> <div id="comu_confirm"> <?php $now = new DateTime(); $date = $now->format('Y/m/d H:i:s'); $title = $_POST['title']; $contents = $_POST['contents']; //test $_SESSION['title'] = $title; $_SESSION['contents'] = $contents; $_SESSION['date'] = $date; if ($_SESSION['date']) { $_SESSION = array(); session_destroy(); }elseif($_POST) { } としてみたところ、if文の処理は動いていました。 なにが悪いのでしょうか? 不足した情報がありましたら開示したいと思いますので教えていただければと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • セッション機構とPHPでの実装

    1. PHPで言うところのセッションとは、  クライアント毎にアカウントされた一連の  アクセス-レスポンス過程 2. session_start();  により、セッションを開始する 3. $_SESSIONによりセッションデータとして外部より取得 4. セッション終了時には,デフォルトでは30min  $_SESSIONによりセッションデータは解放される これは、PHPにおける大まかな一つのセッションの利用形式だと思いますが,実際の機構は次のようなものだと思います.  サーバがセッションを開始する   ↓  セッション管理用一時ファイルを生成   セッションIDを生成,ファイルに入れる  アクセス時刻;セッション変数;代入値 を蓄積    その際にセッションIDはHTTP転送によるパケットのヘッダに付けられるのでしょうか?それによってセッション管理されていることを判別しているのでしょうか?  

    • ベストアンサー
    • PHP
  • PHP4.3.9+smartyのsessionについて

    お世話になります。 PHPで、ログイン画面・入力画面・登録を作りたいと思ってます。 手始めにsessionをクッキーを使わずに使用したいと思い簡単に作ってみました。 login.phpの記述(ログイン) $smarty=new SubSmarty; session_start(); $_session[] $_session["id"]='abcde'; $smarty->display("insert.tpl"); nyuryoku.tpl <html> <head> </head> <body> {$smarty.session.id} </body> <html> この時点でsessionの中身が見れません。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう