• 締切済み

SESSIONの削除について

SESSIONを使用し、問い合わせフォームを作っています。 最後に問い合わせ完了をした際にSESSIONの削除をおこなっているのですが、 どのSESSION削除方法がよいかわからずご質問させていただきました。 ・unset(); ・$_SESSION = array(); フォームから受け取るSESSIONは $_SESSION['contact']['key']; $_SESSION['contact']['data']['name']; $_SESSION['contact']['data']['email']; としており、 unset($_SESSION['contact']); としています。 ところが、ユーザーAとユーザーBが同時にお問い合わせページに入力をおこなったとし、ユーザーAが先に完了した場合ユーザーBのSESSIONも削除される(切れる?)といった現象がおきており、困っております。(もしかしたら別問題かもしれませんが・・・) 自分の認識では unset()は個別に削除でき、ユーザーAのSESSIONのみ削除する。 $_SESSION = array();はユーザーA、ユーザーB両方のSESSIONを初期化(削除)すると認識しております。 間違っておりませんでしょうか?

  • PHP
  • 回答数2
  • ありがとう数0

みんなの回答

noname#244856
noname#244856
回答No.2

全く違います。session_id関数を利用して無理やり他人のセッションIDに変更しない限り、他人のセッションに干渉することはありえません。 unset($_SESSION['var']) → 自分のセッション変数のvarキーを削除する $_SESSION = array() → 自分のセッション変数を空にする というわけで「別問題」説が濃厚となります。 備考: PHPでセッションを完全に破棄する方法 http://d.hatena.ne.jp/Kappuccino/20080726/1217049706

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

状況がよくわからないのですがセッションIDはどのように発行していますか?

imakaradesuyo
質問者

補足

session_start(); if(!isset($_SESSION['contact']['key'])) { $_SESSION['contact']['key'] = md5(uniqid(mt_rand(), TRUE)); } としています。

関連するQ&A

  • $_SESSION = array() と session_destroy(); の関係性。

    //(1)セッション変数の値をクリア $_SESSION = array() //(2)セッションファイルを破棄 session_destroy(); ----------------------------------------------------- 以前にも似たようなことを質問させて頂きましたが、 その時には気にならなかった点が気になって来ましたので、 質問させて頂きます。 で、早速ですが、 (2)をするにあたり、(1)をする意味がわからないので、 どなたか教えて下さい。 セッションファイルを削除したならば、 セッション変数は引っ張って来られなくなるのでは? と私は思っているわけです。 よって、結局、引っ張って来られなくなる変数を、 (1)のようにしてクリアしておく意味が分からないのです。 セッション変数の値は、 セッションファイルから引いてきていると思っているのですが、 そうではないのでしょうか? ---------------------------------------------------------- また、 ちょっと話題は変わり、 unset($_SESSION)としてしまうと、何やらイケナイようなのですが(マニュアルにそう書かれている)、 これをすると、実際、どうなるのでしょう? セッション変数に登録されている複数の値を消す場合には、 array()を使ったり、session_unset()を使えば 良いことは分かっております。 私が知りたいのは、こういうことではなく、 あくまで、unset($_SESSION)してしまうと、 どうなってしまうのか(復元不能な致命的なソース破壊に陥る?!)、 これが知りたいのです。 よって、大きく分けて、質問は2つあることになります。 以上、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ログアウトする際にセッションファイルを削除したい

    PHPでWEBアプリケーションを作成しています。 携帯対応にするために、フォームを使用できないところは セッションIDをURLに付加しています。 ログアウト後(ユーザーがログアウトボタンをクリック)は、戻るボタンをクリックしても「ログインしていません」のエラーメッセージが表示されるようにしたいのです。 現在、ログアウトする際、すべてのセッション変数を削除しているのですが、ブラウザの戻るボタンをクリックすると、もとの画面が表示されます。 その画面にはセッションIDを埋め込んだリンクがあり、 クリックすると正常にリンク先に移動してしまいます。 セッションファイルが残っているために、セッションが継続されたような状態になってしまっているのではないかと思います。 セッションファイルを削除すれば、上記エラーメッセージが表示されるのです。 そこで、ログアウト時にセッションファイルを自動的に削除してしまいたいのですが、どのような方法をとればよいのでしょうか? やっぱり普通にセッションファイルの場所を取得して、削除するしかないのでしょうか? 教えてください。 以下、ログアウト時の処理です。 // セッションの初期化 session_start(); // セッション変数を全て解除する $_SESSION = array(); (session_id('')); // セッションを切断するにはセッションクッキーも削除する。 // Note: セッション情報だけでなくセッションを破壊する。 if (isset($_COOKIE[session_name()])) {   setcookie(session_name(), '', time()-42000, '/'); } // 最終的に、セッションを破壊する session_unset(); session_destroy();

    • 締切済み
    • 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
  • セッションでの買い物カゴとログインの連携

    セッションの連携で困っています ログインとカートにおいてカートの個別の商品をセッションを使って下記の関数を呼び出し、その関数の中にunsetを使うと、正常に消えるのでショッピングカートは動作しますが、今度はログイン情報のセッションが消えてしまいます。 ログイン情報を保ちながらショッピングカートの商品を個別に削除するのにはどうしたらいいか教えて欲しいです // リクエストパラメータから呼び出される関数 function destory($id) { // データベース接続 db_connect() $mysql_tablename = "cart"; $destory_product = mysql_query("SELECT * FROM $mysql_tablename WHERE id=".$id.""); // 商品取り出し $item = mysql_fetch_array( $destory_product ); session_start(); // 削除 session_regenerate_id(); unset($_SESSION["cart"][$item["id"]]); header ("location:".$_SERVER['HTTP_REFERER']); }

    • 締切済み
    • PHP
  • session_cache_limiterについて

    お世話になっています。 キャッシュで、悩んでいます。 ログイン(セッションに名前などを登録)  ↓ 入力フォーム(「登録」ボタンを押す)  ↓ 判定(エラーが発生したら、「戻る」ボタンを押してもらい、 入力フォームに戻る。) という、ごくありきたりな、事をやっているのですが、 iniファイルで、session_cache_limiter('nocache') にすると、「戻る」ボタンを押しても、先ほど入力 したデータが全て消えています。 今度は、入力フォームの先頭で、session_cache_limiter("public");を 入れると、確かに、「戻る」ボタンを押しても、先ほど入力したデータが 保持されていますが、この状態で、 session_unset(); session_destroy(); をして、再度、入力フォームに行っても、前回のセッション情報 (前回ログインした、ユーザー名)を保持したままになっています。 セッションの情報のキャッシュは破棄して、入力フォームのデータ はキャッシュしたいのですが何か良い方法は、無いでしょうか? session_cache_limiter("private");にしても、結果は同じです。 環境は、php4.06 apache1.3 です。 よろしくお願い致します。

    • 締切済み
    • PHP
  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • セッション変数の破棄について、いまひとつスッキリしない部分があります。

    セッション変数の破棄について、いまひとつスッキリしない部分があります。どなたか詳しい方是非ご教授お願いいたします。会員サイトからログアウトするときは、$_SESSION=array(),session_destroy(),そしてクッキーの削除で処理をしてきました。特に問題なく動作をしておりますが、もしログアウト でunset($_SESSION[hogehoge])のように変数を破棄した場合、他のuserの$_SESSION[hogehoge]も削除されてしまうのでしょうか?この部分が、ず~っと疑問に残り解決できませんでした。PCが複数 台あれば、実験してたりかめることもできるのですが1台しかないのでそれができません。ネット上で ずいぶん検索して調べましたが、そこら辺のところをスッキリと理解できるように説明されたページも 見当たらないようでした。もしよいWEBがありましたら、そちらのWEBを紹介していただく形でも結構です。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 検索フォームのセッション管理について

    PHPを利用して検索フォームから入力された値を取得し、 条件にあった画面を表示しているのですがページを戻る際に警告が出て うまく戻れません。 流れ 1,フォームから値の取得 ⇒  2,送られた値を【$a】で受け取り、セッション変数に代入、条件にあったデータの表示(select * from sample where aaa like【$a】) ⇒  3,もしフォームの値が空でセッション変数に値があれば、セッション変数を【$a】に代入し条件にあったデータの表示 ⇒  4,フォームの値、セッション変数共に空ならセッション変数を削除し、他のページに飛ばす 5,新たにフォームから値が送られた場合は値を上書きする 以下が書いたコードです。 session_start(); if(isset($_POST["test"])){ $a = $_POST["test"]; $_SESSION["test"] = $a; }elseif($_POST["test"] == "" and isset($_SESSION["test"])){ $a = $_SESSION["test"]; }else{  unset( $_SESSION["test"] );  if (isset($_COOKIE["PHPSESSID"])) {   setcookie("PHPSESSID", '', time() - 1800, '/');  }  session_destroy();  header( "Location: /top.html" );  exit(); } 以下で【$a】を使いsql文を組み立て、データを表示しています。 このコードだと前のページに戻る際firefoxでは 【このページを表示するにはフォームデータを再度送信する必要があります。フォームデータを再送信すると以前実行した検索、投稿や注文などの処理が繰り返されます。】 と表示され、IEでも 【警告 : ページの有効期限切れ 要求したページは、フォームで送信された情報を使用して作成されました。このページは、もう利用できません。セキュリティ保護のため、情報は自動的には再送信されません。 情報を再送信し、この Web ページを表示するには、ツール バーの [更新] ボタンをクリックしてください。】 と表示されてしまいます 上記のコードをどのように変更すれば警告をださず行いたいことに記述したようにできるのでしょうか? ご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • セッションにはどんなデータを保存するべきか

    セッションにどんなデータを保存していいのかよくわかりません。 私はセッションというのはプログラムでいうところのstatic変数みたいな物かと考えているのですが、 この認識であっているでしょうか? 具体的にはセッションにはユーザID等のWebシステム上全体で保持するべき値のみが許されて、A,B,Cの3つの画面間でのみ共有するような値はセッションに保存してはいけないという具合です。 抽象的な質問ですが、よろしければご回答下さい。

  • フォームの入力値のセッション破棄は?

    Aフォームがありまして、入力して確認ボタンを押し、セッションに入力値が格納されたけど、途中でBフォームへ行ってしまった、という場合、いつまでもAフォームの入力値をセッションに格納しておいても使わないですし、セッション変数名が競合して予期しない動作をしても困るので、他のページへ遷移した時点でAフォームの入力値セッションを削除するようにしたいのですが、実装方法としては、URLまたは絶対パスをセッションに入れといて、画面遷移するごとにそのセッションとURLまたは絶対パスを突き合わせ、一致しなければ削除、というやり方で問題ないでしょうか? ロードバランサ使ってても同一ページなら絶対パスは変わらないのでしょうか??詳しくないんですが…。 美しい実装方法をご教示ください…。

    • ベストアンサー
    • PHP