セッション使用時のセキュリティについて

このQ&Aのポイント
  • 問い合わせフォームをPHPで書いています。セッション使用時のセキュリティについてアドバイスを頂きたいです。
  • 基本的な流れは1.html(入力フォーム表示)→2.php(入力内容を確認)→3.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
  • 回答数2
  • ありがとう数1

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

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

フォームの遷移を、2.phpで諦めて別ページに行ってしまった後に、 直接2.phpにアクセスすると、入力された情報が再度表示されます。 入力者が共有PCなどを使っていた場合に、情報が盗み見られる可能性は否定できません。 ただ、Cookieの有効期限を特に設けていないのであれば、ブラウザさえ閉じれば、同じSessionにアクセスすることが出来なくなります。 後はphp.iniなどで設定しているSessionのGCのタイミングでSessionも削除されます。 なので対策の例としては、2.phpには、POSTメソッド以外でアクセスされた場合に、SessionとCookieの削除を行い、1.phpにでもリダイレクトしたりとか、exitとかでレンダリングしないようにする。 といったところでしょうか。

narusuji
質問者

補足

ありがとうございます。 セッション、クッキーについて詳しく調べたのは初めてなので、 セッションとクッキーについての理解が不足しています。 セッションはサーバ側、クッキーはクライアント側くらいは理解出来ましたが、 クッキーが生成されるのは、session_start()が実行されたらすぐに出来るのか? それともsession_start()が含まれているプログラムが全て実行されてから生成されるか? など、なんとなく気になってしょうがありません。 お教え頂いたとおり、2.phpに$_SERVER['HTTP_REFERER']と$_SERVER["REQUEST_METHOD"]を使用し、1.htmlから来ているか、リクエストメソッドはPOSTかを調べ、もしそうで無ければ、セッションとクッキーを削除してから再び1.htmlの入力フォームに飛ばすようにしてみました。 "2.php"の確認画面でリロード出来る事と、最後の3.phpから2.phpに戻る事が出来るのが気になってしょうがありません。

その他の回答 (1)

回答No.2

>クッキーが生成されるのは、session_start()が実行されたらすぐに出来るのか? >それともsession_start()が含まれているプログラムが全て実行されてから生成されるか? クッキーは、HTTPのヘッダの一種で、持続的に値を持たせる為に開発されたものです。セッションは、そのクッキーを利用したものに過ぎません。 前述したとおり、HTTPのヘッダの一種なので、header関数と同様に、何らかの出力が行われる前、が正解です。 それではセッションとは何なのか、というところですが、PHPのセッションは、session_start関数を叩くと、まず、ユニークなIDを生成します。 ユニークなIDを生成したら、そのIDの名前が付いているファイルを生成して、サーバのphp.iniで設定してあるディレクトリに保存します。 その後、クッキーにそのIDを渡します。 ブラウザはクッキーが生きている間、セッションのIDを持っていることになるので、次にPHPにアクセスしたとき、サーバに保存したセッションファイルの名前とクッキーに持たせたIDを照合して、そのIDと紐付けられたセッションに持たせた値($_SESSIONの中身)を展開できる、というものです。 >"2.php"の確認画面でリロード出来る事と、最後の3.phpから2.phpに戻る事が出来るのが気になってしょうがありません。 この問題は、キャッシュコントロールと、ワンタイムトークンにて、対策を行うことになるのですが、一口に説明できる内容ではないので、一度Googleなどで調べてみてください。

narusuji
質問者

補足

丁寧な解説をありがとうございます。 お陰さまでおぼろげながらですが、理解出来た気がします。 リロード対策としては、以下のアドレスを参考にしてみました。 http://itpro.nikkeibp.co.jp/article/COLUMN/20070910/281585/ キャッシュコントロールやワンタイムトークンについては改めて調べてみます。 アドバイスありがとうございました。

関連するQ&A

  • セッション使用時のフォームのデータ

    PHPでsession_start();とした後のフォームで、その後にフォームで入力したデータをPOSTで送って確認画面を表示したとします。 ここで、最初のsession_start();がなければ、ブラウザの戻るボタンで前のフォーム入力画面へと戻っても、入力したデータは保存されたままですが、session_start();とした後では、入力したデータが全てクリアされてしまうようです。 ちょっと修正したい時に、すべてクリアされてしまうとかなり不便なのですが、何かよい方法はないものでしょうか?セッション変数にPOSTするデータを保存する以外で方法はないものでしょうか?

    • ベストアンサー
    • 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
  • セッションをつかったページについて

    メール送信フォームをPHPで作っています。 入力した値を管理するためにセッションを使っているのですが このページから、他のページに移動する際(リンクをクリック)に URLに http://www.xxxxx.co.jp/dir/?PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx のように表示されてしまいます。 できれば、 http://www.xxxxx.co.jp/dir/ のようにセッションIDは表示しないようにしたいのですが どのようにすればいいのか教えていただけないでしょうか

    • 締切済み
    • PHP
  • 携帯サイトでセッションでのフォームで変数の受け取り方法

    PHP5で携帯サイトでクッキーが使えないという条件でセッションを使ってのformのやりとりでプログラミングしています。 クッキーが使えないのでPHPの先頭で ini_set('session.use_trans_sid', '1'); としていて 入力フォームはセッションをして後は名前を入力するだけの ごく普通です(簡単に書きます)。 session_start(); <form action=onamae.php method=post> 実際にはここに以下の1行が入る <input type="hidden" name="PHPSESSID" value="XXXXXXXXXXXX" /> おなまえ<br><input type=text name=name size=15> <input type=submit value="投稿する"> 問題は受け取りですが $_POST['name']だとうまく受け取れますが $_SESSION['name']だと受け取れません。 入力するフォーム側で何らかの仕掛けが必要なのか分からないのです。 お手数ですが宜しくお願いします。

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

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

  • セッション変数のセキュリティ

    プログラム初心者です セッション変数の安全性について教えてください ログインしているかをセッション変数で判定しています。セッションidは使っていません 質問1 悪意をもったハッカーがセッション変数を取得することはできますか?それともセッション変数はクッキーと違い安全なんでしょうか? 質問2 セッション変数の保持時間は決まっていますか? session_start(); if(!isset($_SESSION['id'])){ header('Location: login.php'); exit(); } よろしくお願いします

    • ベストアンサー
    • PHP
  • PHPの入力フォームのセッションによる値の受け渡し

    PHPの入力フォームに関するフォームの 値の受け渡しについての質問です フォームのフィールドの値の名前はtitleです で$_POSTで値を受け取って$_SESSIONに値を 格納、変数で出力という感じにしたいと思い こう書きました <?php session_start(); $_POST['title']=$_SESSION['tit']; $_SESSION['tit']=$title; ?> <html> <head> <title>test</title> </head> <body> <?php echo $title; ?> </body> </html> こう書いたのですが、値が表示されません 画面が真っ白になってなにも見えないです なにがおかしいのか教えてください issetはあえて使わず書いたのですが それがいけなかったのでしょうか?

    • 締切済み
    • PHP
  • 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
  • セッション変数と配列

    通常の変数であれば、 $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); ですが、セッション変数を配列にするにはどうしたら良いのでしょう? (配列から取り出す方法も含め) $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); $_SESSION["$var"]; や $_SESSION["$var"] = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); としてみましたが、ダメなんですね。 よろしくお願いいたします。 *PHPバージョンは5です

    • ベストアンサー
    • PHP
  • セッション PHPとHTML

    form1.htmlのaction先にorder.phpを指定し、そのorder.phpで$_POSTを使ってform1.htmlのフォーム情報を取得します。その後、order.phpはheader(Location)でform2.htmlをブラウザ上に表示させます。 form2.htmlはaction先が同じorder.phpになっており、ifで動作を制御しています。form2.htmlのsubmitボタンを押すと、画面上にorder.phpにより、今まで2つのフォームで入力した内容が表示されます(order.phpはsessionですべての変数を保持しています)。 この時「form1の内容を訂正」「form2の内容を訂正」というリンクないしボタンを設けて、該当フォームに飛べるようにしたいのです。 このリンク/ボタンで該当フォームに飛んだ場合、入力内容がフォームに表示されるようにするには、どのようにすればいいのでしょうか? いまいちsessionの詳しい使い方が分からなくて困っています・・・。

    • ベストアンサー
    • PHP

専門家に質問してみよう