• ベストアンサー

セッションを使わずに遷移先画面に変数の値を渡すには?

<input type="hidden" value="myID">みたいな隠しフォームで 行く先々の画面に値をPOSTで渡してきました。 他方、 header("Location: mypage.php") のように画面を遷移させる場合、遷移先の画面に $_POST["myID"]のように値を渡すことはできませんか? この場合session_start();を使って、$_SESSION["myID"]のように値を 渡す(保持する)のが王道なのでしょうか? セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 できれば使いたくないのです。 具体的に説明しますと、前にこの掲示板で教えていただいた、次の例を使っています。 入力文字チェックをかけたいのでPHP_SELFで同じ画面を呼び出して、 問題なければmypage.phpにリダイレクトさせる枠組みですが、 header("Location: mypage.php");という風に遷移した場合は、 遷移先のmypage.phpでは、$_POST["myID"]はPOSTされてきませんよね (値を受け取れませんよね)?? 妙案あればご教示下さい。 <?php if ($_POST["reg"] == "" ) $errFlg = true; if (!$errFlg) {     if (strlen($_POST["myName"]) > 30) {       $errFlg = true;       $errStr["myName"] = "30字以下";     }   $errMsg = "エラー!!"; } if ($errFlg) { ?> <html>   <body>     <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>">       氏名 <input type="text" name="myName" value="<?= $_POST["myName"] ?>"><?= $errStr["myName"] ?>       <input type="hidden" name="myID" value="<?= $_POST["myID"] ?>">     </form>     <input type="submit" name="reg" value="登録">   </body> </html> <?php } else {     $sql = "update mytable set myID = 'xxxx'";     $rst = mysql_query($sql, $con);     header("Location: mypage.php"); } ?>

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

結局「sessionの真似事」を自前でするようなことになりそうです。 ・ランダムなファイル名を作成して、そのファイルにアドレスを書き込む。 ・GETでファイル名を渡す。 ・ファイル名を元にそのファイルからアドレスを取り出す。 ・ファイルを削除する 何らかのトラブルで残ってしまったファイルは「一定時間以上経過したファイルは定期的に削除」というGCの真似事までしないといけなくなりますけど。 hidden(POST)で持ち回るということからも「セキュリティ」はまったく考慮しなくていいシステムのようなので、そうであれば「復号可能な暗号化」という手もありかもしれません。 >セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 >できれば使いたくないのです。 普通に使いますけどねぇ・・。

litton101
質問者

お礼

shimixさん、興味深いご指摘ありがとうございました。 >結局「sessionの真似事」を自前でする 結構大変なことになるんですね・・・ >hidden(POST)で持ち回るということからも「セキュリティ」は >まったく考慮しなくていいシステムのようなので、 不勉強ですみません、 セキュリティは考慮しなくて良いわけではないですが、 #1さんもご指摘のように、危なさはPOST<GET、POSTもは けっこう危ないのでしょうか? SESSIONを使えるなら、そのほうがいいのでしょうか?? > >セッションと聞くと何かとトラブルになりやすそうなイメージがあり、 > >できれば使いたくないのです。 > > 普通に使いますけどねぇ・・。 そういうものですか・・・トラブルというと語弊がありますね。 扱いが難しそうなイメージがあって使わないほうが無難な 固定観念がありました。 POST持ち回りより、セッションのほうがいいですか。 本題から派生質問になりますが、もしよろしければ率直なところ、 アドバイスいただけますと幸いです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>#1さんもご指摘のように、危なさはPOST<GET、POSTもは >けっこう危ないのでしょうか? > >SESSIONを使えるなら、そのほうがいいのでしょうか?? POSTにしてもGETにしてもブラウザとサーバの間のデータを見られたら丸見えです。また生のIDをやり取りしてしまうと、ローカルにhtmlを落として加工してPOSTされたら「別のIDになりすます」ことも簡単にできてしまいます。sessionを使えば「サーバ側で作成したランダムなsession_id」を推測しないといけないので強度は上です。そこまでやっていてもセッションハイジャックなんてことも考慮しないといけませんけど(下記URLなどを参考に)。   http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html#PHP_Session SSLを使えればいいんでしょうけど、個人サイトではなかなか難しかったりもします(もちろん個人情報が乗っかるようだとSSLが必須ですが)。 そこまでは不要という場合でも単純にGETやPOSTに生のIDを入れるべきではないです。自分のブラウザのHTMLに自分のIDが見えれば、ちょっとした悪戯心でなりすましを「やってみよう」という気にさせてしまいます。sessionを使っていれば少なくとも普通のユーザが「ちょっとやってみよう」とは思わないでしょう。

litton101
質問者

お礼

shimixさん、たびたび詳細に解説ありがとうございました。 本当によく理解できました。 #1さんのおっしゃる >ハックがちょっと面倒なだけで というのは、ブラウザのURL欄をいじるより 「ローカルにhtmlを落として加工」方が少し面倒、そういう意味に 捕らえました。いずれにせよ、認証とかでセッション使ったほうが 便利なので、変数の持ち回りはやめにします。 本当にありがとうございました

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ヘッダのLocationは純粋にURLを読み替えているのでPOST値は 渡し様がないでしょうね。 そもそもPOSTはハックがちょっと面倒なだけで秘匿性があるわけではなく セキュリティ上GETと変わりません。 ならGETでわたしちゃうというの手かなぁ・・・ ちなみに真剣にソースみてないのでなんとも言えませんが  $sql = "update mytable set myID = 'xxxx'"; ってmytableのmyIDを全てxxxxにしてしまうという恐ろしいことを やっていますが、これは仕様上問題ないのでしょうか?

litton101
質問者

お礼

yamabejpさん、いつもお世話になります。 元ソースの仕掛けは、一昨年yamabejpさんに教わったものだったりします。 http://okwave.jp/qa2419133.html ご教示のGETで渡す場合、URLにメールアドレスが表示されてしまいますが、 表面上隠して渡すことはできますか。 http://localhost/sample.php?id=myname@example.com ちょっと調べてみたところ、無理っぽいですが・・・ http://mtlab.ecn.fpu.ac.jp/WSM_2000/000829170425.html

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • header(Location: next.php) だとPOSTした値が渡らない?

    文末は(だいぶ端折ってますが), (1) エラーがあればエラー表示, (2) エラーがなければnext.phpに飛ぶ という動作をするのですが, next.php 内に echo $_POST["Name"]; とか echo $_POST["reg"]; とか書いても valueの中身が渡ってきていません. header("Location: next.php"); で飛ばすとだめなのでしょうか. http://oshiete1.goo.ne.jp/qa2706500.html でも,#2さんのアドバイスのようにしようとしましたが, #1さんのご教示のように,セッションを利用するしかないですか? ちょっとセッションで値の渡し方がチンプンカンプンなのですが・・・ <?php session_cache_limiter('none'); session_start(); header("Cache-control:no-cache"); header("Pragma:no-cache"); $errFlg=false; if ( $_POST["reg"] == "" ) $errFlg = true; if ( !$errFlg ) { if ( $_POST["Name"] == "" ) { $errFlg = true; $errStr["Name"] = "未入力"; } } if ( $errFlg ) { ?> <html><body> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <?= $errStr["Name"] ?></td> <input type="text" name="Name" value="<?php echo $_POST["Name"]; ?>"> <input type="submit" name="reg" value="登録"></td> </form> </body></html> <?php } else { header("Location: next.php"); } ?>

    • ベストアンサー
    • PHP
  • 別画面から遷移してきた時はDBを読み、それ以外のときはPHP_SELFを使いたい

    http://oshiete1.goo.ne.jp/kotaeru_thanks.php3?a=7486449 の#3さんにご提示いただいたサンプル(→update.phpとします)を 組み込んでみたのですが、 投稿者名<input type="text" name="name" value="{$_POST["name"]}">{$errStr["name"]}<br> の「value=""」の値について、 update.phpに遷移してきた際は、↓みたいなプロセスを経てMySQLから 読み込んだ$col["name"]を直に表示させたいです。 $myID = GetmyID(); $con = mysql_connect(localhost, root, pw); $selectdb = mysql_select_db(serv, $con); $sql = "SELECT * FROM MyTab WHERE ID = '$myID'"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $name = $col["name"]; その場合、冒頭の#3さんのサンプルの value="{$_POST["name"]}" …を、 value="if (PHP_SELFでなく別画面から遷移してきて表示する場合) {   {$_POST["name"]} } else {   {$_POST["name"]} }" みたいに分岐すればいいのではないかと思いますが、 「PHP_SELFでなく別画面から遷移してきて表示する場合」の判断は どのようにしたらできますでしょうか。

    • ベストアンサー
    • PHP
  • php $_SESSIONで値が消える。

    いつもお世話になり誠にありがとうございます。 標記の件。 インプット画面ー>確認画面ー>戻るー>インプット画面 インプット画面に戻った時、どうしても最初のインプット画面で打った内容が消えてしまいます。 プログラムを診て、誤りを指摘して頂けないでしょうか? どうぞよろしくお願い致します。           記 <?php session_start(); $mode = 'input'; if( isset($_POST['back']) && $_POST['back'] ){ //何もしない } else if( isset($_POST['confirm']) && $_POST['confirm'] ){ $_SESSION['name'] = $_POST['name']; $_SESSION['email'] = $_POST['email']; $_SESSION['category']= $_POST['category']; $_SESSION['message'] = $_POST['message']; $mode = 'confirm'; } else if( isset($_POST['send']) && $_POST['send'] ){ $mode = 'send'; } else { $_SESSION['name'] =""; $_SESSION['email'] =""; $_SESSION['category']=""; $_SESSION['message'] =""; } ?> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <div class="v_line_fix"> <h1>Blog K・T</h1> <h2><a href="index.html">トップページ</a></h2> <?php if( $mode=='input'){ ?> <form method=post> お名前(ニックネーム)<br> <input type="text" name="name" value="<?php echo $_SESSION['name'] ?>"><br> Eメール<br> <input type="email" name="email" value="<?php echo $_SESSION['email'] ?>"><br> カテゴリー<br> <input type="text" name="category" value="<?php echo $_SESSION['category'] ?>"><br> 本文<br> <textarea style="font-size:1.5em;" cols="30" rows="80" name="message"><?php echo $_SESSION['message'] ?></textarea><br> <input type="submit" name="confirm" value="確認" /> </form> <?php }else if( $mode=='confirm'){ ?> <!--確認画面--> <form method="post"> <?php echo $_SESSION['name']?><br> <?php echo $_SESSION['email']?><br> <?php echo $_SESSION['category']?><br> <br> <?php echo nl2br($_SESSION['message'])?><br> <input type="submit" name="back" value="戻る"/> <input type="submit" name="send" value="送信"/> } </form> <?php } else { ?> <!--完了画面--> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • ローカル環境で動くのに本番環境で動かない(セッション変数が渡せず)

    以下は、 (1) テキストフォームに記入された値をPOSTすると (2) 文字列はSESSION変数としてセットされてpage2に遷移し (3) page2 に書き出される というものですが、 ローカルのWInXP(SP3)+IIS+PHP5.2.6では動作するプログラムが 今般レンタルしたサーバー上で(FreeBSD+Apache1.3.37+PHP5.2.2) では動作しません。 具体的には、page2.phpに遷移できずに Warning: Cannot modify header information - headers already sent by (output started at /usr/home/myaccountname/public_html/page1.php:7) in /usr/home/myaccountname/public_html/page1.php on line 14 となります。 ちなみに、page1.phpの<?php $_SERVER["PHP_SELF"] ?>を page1.phpに書き換えても改善ありませんでした。 ローカルで動いていたものがそのまま動作するとも思っていませんが、 見直すべき設定項目として、何がありますでしょうか? ---------------------------page1.php <?php session_cache_limiter('none'); session_start(); ?> <html> <body> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <input type="text" name="email"> <input type="submit" name="reg"> </form> <?php if ($_POST['email'] != "") { $_SESSION["email"] = $_POST["email"]; header("Location: page2.php"); } ?> </body> </html> ---------------------------page2.php <?php session_cache_limiter('none'); session_start(); ?> <html><body> <?php echo $_SESSION["email"]; ?> </body></html>

    • ベストアンサー
    • PHP
  • docomoのセッションが切れてしまうのは?

    携帯サイト用のセッションでdocomoの時だけ思うように フォームによるページ遷移ができません。 色々試してみたのですが、サッパリです。 どなたかお知恵をお貸し下さい。 例) -- page01.php -- session_name( "test" ); session_start(); session_regenerate_id(true); $test = session_name()."=".session_id(); if ( ( $smp01 = auth() ) == FALSE ) { header( "Location: ./test.php?redirect=index_test.php?" ); exit; }←ログイン時の処理(ユーザー定義関数にて) ・        ・        ・        ・ <form action="page02.php?<?= $test ?>" method="get" /> 入力:<input name="test01" type="text" value="" /> <input name="smp02" type="submit" value="next" > </form> ↑入力させてpage02.phpにて処理 上記のようにしているのですが、 submitするとログイン時の処理に掛かってセッションが切れてしまい ログインページに戻ってしまいます。 ログイン時の処理を削除するとpage02.phpへと遷移します。 ログイン時の処理を残したままセッションが切れずにフォームによる ページ遷移ができるようにするにはどのようにすれば良いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 認証した後の画面遷移

    こんにちわ。現在、管理者名とパスワードを入力し、空白時、半角英数以外の入力がされたとき、管理者名もしくパスワードが違うときにそれぞれのページに飛ばそうと思っているのですが、どうしても空白字のページ(header( "Location: masterfalse01-01.php" );にしか行かず悩んでいます。ちなみに、あらかじめ決めた管理者とパスではきちんと次の画面に飛ぶことはできました。 <html> <head><title>認証</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center><br>管理者名</br> <form method = "post" action = "shoppingmaster.php" > <input type = "text" name = "MASTERNAME"><br> <center><br>パスワード</br></center> <input type = "password" name = "PASS"> <p><input type = "submit" name = "submit" value = "ログイン"></p> </center> </form> <?php $MasterName = mb_convert_kana($str,"rna"); $Password = mb_convert_kana($str,"rna"); if($_POST["submit"] == "ログイン"){ if($_POST["MASTERNAME"] == "abc" && $_POST["PASS"] == "efg") { header("Location: shoppingform.php"); }else if( $MasterName == "" || $Password == ""){ header( "Location: masterfalse01-01.php" ); }else if(!ereg("^[A-Za-z0-9\-]",$MasterName, $Password )){ header( "Location: masterfalse01-02.php" ); }else { header( "Location: masterfalse01-03.php" ); } } ?> </body> </html> ご回答お願いできますでしょうか?

    • ベストアンサー
    • PHP
  • セッションについて教えてください。

    PHPを独学で勉強中の初心者です。(HTMLとCSSくらいしか分からない所からのスタートです) ログインフォーム→パスワード処理→コンテンツ表示というながれで作っています。 質問は、セッションの有効期限はデフォルトではブラウザを閉じるまでと聞いたのですが、それはウインドウを閉じるではなく、アプリケーションを終了するまでということでよいのでしょうか?ウインドウを閉じただけだと、コンテンツを表示できてしまいます。 また、コードがこんなんでよいものかアドバイスよろしくお願い致します。 --パスワード処理-- <?php session_start(); $id =p; $password =11; $n_id = $_POST["n_id"]; $n_password = $_POST["n_password"]; if(($n_id == $id ) && ($n_password == $password)){ $_SESSION['pass'] = 1; header("Location: page1.php"); }else{echo "IDまたはパスワードが違います。"; } ?> ----コンテンツページ----- <?php session_start(); if(isset($_SESSION["pass"]) && $_SESSION["pass"] == 1){ echo "コンテンツ"; echo "<html><head> <meta http-equiv=Content-type content=text/html; charset=EUC-JP> </head><body>"; echo "<form action =logout.php method=post>"; echo "<input type=submit name=sbm value=ログアウト>"; echo "</form></body></html>"; }else{ header("Location:login1.php"); } ?>

    • 締切済み
    • PHP
  • ウィザード形式のアンケートを作りたい

    HTML_QuickForm_Controllerみたいに,ウィザード形式で 進めるアンケートを作りたいです. まず,http://oshiete1.goo.ne.jp/qa2419133.htmlのNo3さんの 回答を元に1枚アンケートを作りました. アンケート回答を記入後,「送信」ボタンを押すと データベースをUpdateして,同じPHPファイルを読み込み(PHP_SELF) 記入にエラーがあればメッセージを, DB更新に成功したら更新成功,失敗したら失敗と表示するもの. ここで,更新がうまくいったら成功と表示するのではなく, 別のPHPファイルを読み込みたい(次のページに遷移したい)です. (無論.記入漏れやDB更新に失敗しら遷移せずにエラーが必要です) 骨組みだけ示すと,下記のような感じですが, 次のページに飛ばすには,どうしたらいいでしょうか. <?php $myID = getMyID(); $errFlg=false; if ( $_POST["reg"] == "" ) $errFlg = true; if ( !$errFlg ) $errmsg = "エラーあり"; if ( $errFlg ) { ?> <html> <body> <?php echo $errmsg; ?> <form method="post" action="<?php $_SERVER["PHP_SELF"] ?>"> <input type="text" name="email" value="<?php if($_POST["reg"]=="") { echo $db_email; } else { echo $_POST["email"]; } ?>"><?= $errStr["email"] ?> <input type="submit" name="reg" value=" 送信 "> </form> </body> </html> <?php } else { $email = $_POST["email"]; $con = mysql_connect(localhost, root, pass); $selectdb = mysql_select_db(mydb, $con); $sql = "UPDATE mytable SET email = '$email', WHERE myID = '$myID'"; $rst = mysql_query($sql, $con); if ($rst) { $body = "更新成功"; } else { $body = "更新失敗"; } print "$body<br><a href='menu.php'>戻る</a>"; } ?>

    • ベストアンサー
    • PHP
  • セッションにIDを振って値を代入

    PHP初心者です。 PHP4.2.xを使っています。 ショッピングカートで購入した商品データをセッションで維持してカートに追加する機能部分を作っていますがうまくいきません。 コードは以下のとおりです。 【goods.php】 ----------------------------------------------------------- <? session_start(); ?> ■商品1 <form action="cart.php" method="POST"> <input type="hidden" name="id" value="1" /> <input name="num" type="text" /> <INPUT type=submit value="カートに追加"> </form> ■商品1 <form action="cart.php" method="POST"> <input type="hidden" name="id" value="2" /> <input name="num" type="text" /> <INPUT type=submit value="カートに追加"> </form> ----------------------------------------------------------- 【cart.php】 ----------------------------------------------------------- <? session_start(); if($_POST['id'] != ""){ $id = $_POST['id']; $num = $_POST['num']; // セッション名自体をIDで作っています。中身は個数のみです。 $_SESSION["$id"] = $num; } echo "カートに入ってる商品<br />"; for ($i = 0; $i<=100; $i++) { if (!empty($_SESSION["$i"])){ echo $_SESSION["$i"]. "<br>\n"; } } ?> ----------------------------------------------------------- goods.phpのファイルで商品1と商品2を1つずつカートに入れれば cart.phpのページで 1 1 と表示されるはずが、1しか出ません。 $_SESSION["1"] $_SESSION["2"]の中身が表示される予定でしたがそうならず、 そのときPOSTで投げられたIDしか$_SESSION["$id"]に保持されません。 どうすればどんどん商品をカートに追加できますでしょうか? アドバイスのほどどうぞよろしくお願いします!

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

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • PHP
旦那の容姿を褒めていますか?
このQ&Aのポイント
  • 旦那の容姿を褒めているのに、なぜ夫婦間で攻撃し合うのか。
  • 夫婦は対等な関係であり、お互いの容姿を褒め合うべき。
  • 容姿への攻撃は相手を傷つけ、離婚の原因になる可能性もある。
回答を見る

専門家に質問してみよう