- 締切済み
PHPで隠しデータをPOST送信する方法
<form name="example" method="POST" action="example.php"> <input type="text" name="id" value="" /> <input type="password" name="pw" value="" /> <input type="submit" value="ログイン" /> </form> 上記のようなログインフォームがあるとします。 <input type="hidden" />のようにソースを見たらわかってしまう方法ではなく、 クライアント側で完全に見えないよう、id,pwの送信と同時にPHPで隠しデータをPOST送信する方法はございますでしょうか。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- muuming2001
- ベストアンサー率23% (202/847)
超推測ですが、おそらく前のページから次のページにデータ引き継ぎをクライアント側に見せない形で行いたいんじゃないかなと思います。 上記該当でしたら、セッションを使いましょう。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
そういうのはOpenIDやOAuthでいいんじゃないでしょうか。 (もちろん、OAuthの認証サーバー、利用サーバーの両方を作る必要があります。)
お礼
ご提案ありがとうございます。 認証する側のサーバは別のところが管理していますので、仕様の変更が難しいので、POST送信で可能であれば、そちらで済ませたいと考えておりますが、方法がなければ検討させて頂きます。
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
そもそもの話になりますが。 何らかの形で隠せたとして、見えない物をどうやって入力するのですか? 逆に、何らかの方法で入力したのなら、「入力したデータ」が送信されている事は容易に推測できるはずですので、隠すまでもなく目に見えて送信できても問題ないのではないでしょうか。
お礼
ご回答ありがとうございます。 To_aru_Userさんへの補足で書かせて頂きましたが、ユーザーの入力を必要としないものです。
【Cookieについて】 IT用語辞典 - Cookie http://e-words.jp/w/Cookie.html PHP Manual - Cookies http://www.php.net/manual/ja/features.cookies.php 【スーパーグローバル変数の一部】 ・$_GET →ユーザー側からGET送信されたデータ ・$_POST →ユーザー側からPOST送信されたデータ ・$_COOKIE →ユーザー側からCOOKIE送信されたデータ ・$_REQUEST →ユーザー側からGET/POST/COOKIE送信された複合データ 【これらの変数をユーザーが覗き見る方法】 ・$_GET →ブラウザのアドレスバーを見れば一目瞭然 ・$_POST →LiveHTTPHeadersなどのFirefoxアドオンを使えば見れる ・$_COOKIE →LiveHTTPHeadersなどのFirefoxアドオンを使うか、Cookieが保存されているフォルダを覗けば見れる ・$_REQUEST →上記3つ同様に可能 つまり、これらのどれを使っても厳密に隠蔽するのは不可能ということです。ユーザーに見られずに1ユーザーごとに情報を割り当てて保持したい場合、セッションという機能を使います。 PHP Manual - セッション http://www.php.net/manual/ja/book.session.php これはあくまで、Cookieを応用した技術です。PHPによって自動的に割り振られるCookie、「セッションID」で個人を識別し、サーバー側に保存されている1人1人の変数の値を取り出してくることが出来ます。 A Magic Web - PHPとセッションのまとめ http://www.a-magic-web.com/2009/05/php_session/ セッションを完全に破棄する(安全にログアウトさせる)方法は少し複雑なので注意してください。 プログラマはサイコロを振らない - PHPでセッションを完全に破棄する方法 http://d.hatena.ne.jp/Kappuccino/20080726/1217049706 またログイン直後(ユーザー個人を識別するページの開始直後)には、「session_regenerate_id(true);」をコールすることによってセッション固定攻撃に対策を取る必要があります。 PHP Manual - session_regenerate_id http://php.net/manual/ja/function.session-regenerate-id.php Wikipadia - Session fixation http://en.wikipedia.org/wiki/Session_fixation クロスサイトリクエストフォージェリ攻撃に対する対策も必要です。 Wikipadia - クロスサイトリクエストフォージェリ http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA Webセキュリティの小部屋 - クロスサイト・リクエストフォージェリ(CSRF)対策(PHP編) http://www.websec-room.com/2013/03/07/479
お礼
To_aru_Userさん ご回答ありがとうございます。 To_aru_Userさんのセキュリティに関する記事はたまに拝見させて頂いておりますが、まだまだそのレベルに到達できないでいます。 $_GET、$_POST、$_COOKIE、$_REQUEST、これらがユーザーに見られることは知っておりますが、送信したあとは特に問題ないんです。 今回は別サーバ(こちらの管理外)へログイン情報を送信して、その返答をエラーの場合はエラーコード、成功の場合はユーザーIDなどをGETで返してもらうという流れでして、こちらで登録情報を保持していませんので、もちろんGETで返されたデータの真偽は判断できません。しかしそうなりますと適当にパラメータつけたらログインできてしまいます。こんなアホな話はないわけです。 そこで考えたのが送信前に毎回ランダムな値をユーザーに見えない形でこちらで保持し、それを送信して返してもらって、ログインOKの返答あり、かつそのランダムな値が一致していれば、こちらでログイン成功と判断する。 しかし、果たしてこちらで保持しているランダム値を直前まで見えない形でPOST送信できるのかを知りたかったです。 もちろんこちらではログインからログアウトまではセッションで管理しています。 題名とは違ってきますが、もし他にもっといい方法がございましたら、ご提案いただけますと幸いです。 よろしくお願いいたします。
- notnot
- ベストアンサー率47% (4900/10360)
>クライアント側で完全に見えないよう、id,pwの送信と同時にPHPで隠しデータをPOST送信する方法はございますでしょうか。 そういう方法はありえません。 HTMLに現れないという方法でいいなら、Cookieを使う。 なお、PHPかどうかはクライアント側には関係ないことです。
お礼
ご回答ありがとうございます。 やっぱりないんですね。 >HTMLに現れないという方法でいいなら、Cookieを使う。 これを詳しくお願いできますでしょうか。 ちなみにPHPなのは現在そのファイルがPHPだからです。
お礼
ご回答ありがとうございます。 もちろんこちらで管理しているサーバ内のページはセッションを使用しております。 ただ、To_aru_Userさんへの補足で書いておりますが、別のところが管理しているサーバへID/PWをPOST送信すると同時に、隠しデータを送れないかを考えております。隠しデータは送信する直前まで見えなければ大丈夫です。