0

私はWebアプリケーションで作業しており、HTTPリダイレクトを介してデータを渡す必要があります。たとえば:HTTPリダイレクトでデータを渡すオプション

http://foo.com/form.html 

のPOSTデータに問題がある場合は

http://foo.com/form/submit.html 

に、応答

http://foo.com/form.html?error=Some+error+message 

とクエリのparam "エラー" に戻ってリダイレクトされますの値がページに表示されます。

リダイレクト(つまり、HTTPヘッダーなど)でデータを渡す信頼できる方法はありますか。

クエリが作品をparamsはなく、ために理想的ではないとしてデータを渡す:(SSLがencyrptにに頼っていたことがカントので、およびクエリ文字列で)

  • その平文ので、私は合格したいとは思わないでしょう機密データ
  • URIの長さはブラウザによって制限されています(長さは一般にかなり長い)。

重要:このプラットフォームは、状態がなく、多くのアプリケーションサーバーに分散されているため、サーバー側セッションオブジェクトのデータを追跡することはできません。

+1

"* [...]とクエリ文字列では、SSLはencyrpt *に依存できません。"とにかくあなたはここで普通のHTTPを使用していますが、[HTTPSは**すべて** HTTPトラフィックを暗号化しています](http://stackoverflow.com/a/8858241/372643)ここで何を言おうとしているのか分かりません。 – Bruno

+0

@ Brunoのコメントにもう一度触れてください:リクエストラインがSSLで保護されていないという点にはどうしたらなりますか?後であなたが繰り返すコメントは、「クッキーは暗号化されていますが、リクエストラインではありません」...これは当てはまりません。 SSLはIPペイロードをトンネリングし、すべてのHTTPプロトコルがその一部です(要求行、ヘッダー、ペイロード...)。リクエストラインは、* application *(ブラウザ、ログ)レイヤーで見るのが非常に簡単です。しかし、少しでも*複雑になっても、ここでは同じセキュリティリークが発生します。 – mtraut

答えて

1

クライアントとサーバーの対話の観点から、これはサーバーの内部ディスパッチの問題です。

ブラウザは、the HTTP specificationに基づいて自動的に最初のリクエストのエンティティを再掲載するものではありません。 "必要なアクションは、ユーザーエージェントとの対話なしに実行することができます。 2番目のリクエストはGETまたはHEADです "

もしまだそうでなければ、form.htmlをダイナミックにしてHTMLの静的ファイルにしてください。 POSTリクエストを自分自身に送信し、エラーが発生した場合には値をあらかじめ入力してください。または、submit.htmlに問題がある場合はform.htmlと同じテンプレートを使用することもできます。

その平文(およびクエリ文字列では、SSLが encyrptにに頼っていたことがカントので)ので、私は問題が何であるかわからないんだけど、機密データに

を渡すのは嫌ですここに。あなたはとにかくプレーンなHTTPの上にすべてを提出しています。 Cookie、クエリパラメータ、リクエストエンティティはすべて表示されます。 HTTPS would actually protect all thisを使用すると、ブラウザの履歴とサーバーログ(これは接続の一部ではなく、TLSが保護するものです)でクエリパラメータが引き続き問題になることがあります。

+0

おっと - 私はPOSTがオプションでSSLであると言うことを意味しました - したがって、本体(POSTの内容)は暗号化されます。クエリパラメータは、SSL/HTTPS要求であっても、SSLによって暗号化されません。カスタム暗号化ソリューションが必要です。 – empire29

+0

あなたの提案されている解決策が明確ではありません。私はPOST-Redirect-GETデザインパターンを使用しており、POSTハンドラから結果のGETレスポンスに情報を送信したいと考えています。このデザインパターンは、あなたが引用したガイダンスの中で絶対的にインラインです。 – empire29

+0

@ empire29クエリパラメータ** ARE **は、HTTPSを使用しているときに暗号化されます。テキストにリンクされている以前の回答を確認してください。信じる必要はありません.HTTPSの仕様を読んで、Wiresharkを試してみてください。 – Bruno

1

私は、クッキーを使用することは、データの量によって妥当な解決策になると思います。

http://foo.com/form.html?error_id=42:あなたはあなたがidで、それをサーバーおよび参照上のデータベースにエラーメッセージを格納することができます

+0

Cookieも安全ではありません。それらはプレーンテキストとして渡されます。 –

+1

合意して、それに注意を払わなかった。しかし、あなたがencriptionを使用しない限り、クライアント側にデータを安全に渡す方法はないと思います。おそらく、ユーザーセッション(または上記のようなデータベース)に情報を格納する方が良い方法でしょう。 – eduardohl

+0

クッキーの値は暗号化できるので、プレーンなbase64のテキストだけが渡されます –

1

(はるかに簡単になります例えばセッションを使用して)サーバー側でそれを追跡することができないので

エラーテキストが修正された場合でも、データベースを使用する必要はありません。

また、Web Storageを使用することもできます。代わりに、あなたはこのJavaScriptで出力ページを表示することができ、「場所」ヘッダーとリダイレクトの:

var error_message = "Something is wrong"; 
if(typeof(Storage) !== "undefined") { 
    localStorage.error_message = error_message; 
else { 
    // fallback for IE < 8 
    alert(error_message); 
} 
location.href = "new url"; 

とリダイレクトした後、あなたはJavaScriptを使用してlocalStorage.error_messageを読み、メッセージを表示することができます。

+0

Hrm - true - これには、クリア/フラッシングルーチンを使用した持続メカニズムが必要です。私はこの解決策が大好きであることを確信しています。 – empire29

+0

私は別の解決策を追加しました。 –

関連する問題