プロが教える店舗&オフィスのセキュリティ対策術

<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");
}
?>

A 回答 (3件)

結局「sessionの真似事」を自前でするようなことになりそうです。



・ランダムなファイル名を作成して、そのファイルにアドレスを書き込む。
・GETでファイル名を渡す。
・ファイル名を元にそのファイルからアドレスを取り出す。
・ファイルを削除する

何らかのトラブルで残ってしまったファイルは「一定時間以上経過したファイルは定期的に削除」というGCの真似事までしないといけなくなりますけど。

hidden(POST)で持ち回るということからも「セキュリティ」はまったく考慮しなくていいシステムのようなので、そうであれば「復号可能な暗号化」という手もありかもしれません。



>セッションと聞くと何かとトラブルになりやすそうなイメージがあり、
>できれば使いたくないのです。

普通に使いますけどねぇ・・。
    • good
    • 0
この回答へのお礼

shimixさん、興味深いご指摘ありがとうございました。

>結局「sessionの真似事」を自前でする

結構大変なことになるんですね・・・

>hidden(POST)で持ち回るということからも「セキュリティ」は
>まったく考慮しなくていいシステムのようなので、

不勉強ですみません、
セキュリティは考慮しなくて良いわけではないですが、
#1さんもご指摘のように、危なさはPOST<GET、POSTもは
けっこう危ないのでしょうか?

SESSIONを使えるなら、そのほうがいいのでしょうか??

> >セッションと聞くと何かとトラブルになりやすそうなイメージがあり、
> >できれば使いたくないのです。
>
> 普通に使いますけどねぇ・・。

そういうものですか・・・トラブルというと語弊がありますね。
扱いが難しそうなイメージがあって使わないほうが無難な
固定観念がありました。

POST持ち回りより、セッションのほうがいいですか。
本題から派生質問になりますが、もしよろしければ率直なところ、
アドバイスいただけますと幸いです。

お礼日時:2008/02/18 09:21

>#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_se …

SSLを使えればいいんでしょうけど、個人サイトではなかなか難しかったりもします(もちろん個人情報が乗っかるようだとSSLが必須ですが)。

そこまでは不要という場合でも単純にGETやPOSTに生のIDを入れるべきではないです。自分のブラウザのHTMLに自分のIDが見えれば、ちょっとした悪戯心でなりすましを「やってみよう」という気にさせてしまいます。sessionを使っていれば少なくとも普通のユーザが「ちょっとやってみよう」とは思わないでしょう。
    • good
    • 0
この回答へのお礼

shimixさん、たびたび詳細に解説ありがとうございました。
本当によく理解できました。

#1さんのおっしゃる
>ハックがちょっと面倒なだけで

というのは、ブラウザのURL欄をいじるより
「ローカルにhtmlを落として加工」方が少し面倒、そういう意味に
捕らえました。いずれにせよ、認証とかでセッション使ったほうが
便利なので、変数の持ち回りはやめにします。
本当にありがとうございました

お礼日時:2008/02/20 00:04

ヘッダのLocationは純粋にURLを読み替えているのでPOST値は


渡し様がないでしょうね。

そもそもPOSTはハックがちょっと面倒なだけで秘匿性があるわけではなく
セキュリティ上GETと変わりません。
ならGETでわたしちゃうというの手かなぁ・・・

ちなみに真剣にソースみてないのでなんとも言えませんが
 $sql = "update mytable set myID = 'xxxx'";
ってmytableのmyIDを全てxxxxにしてしまうという恐ろしいことを
やっていますが、これは仕様上問題ないのでしょうか?
    • good
    • 0
この回答へのお礼

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 …

お礼日時:2008/02/17 20:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています