302リダイレクトはリファラー文字列を維持しますか?


92

ユーザーをあるページから別のページにリダイレクトする必要がありますが、元のリファラー文字列を維持する必要があります。したがって、たとえば、ユーザーがhttp://www.othersite.com/pageA.jspから開始する場合は、http://www.example.com/pageB.jspに移動するリンクをクリックすると、302が実行されます。http://www.example.com/pageC.jspにリダイレクトします。リファラー文字列を含める必要がありますhttp://www.othersite.com/pageA.jsp

これは302リダイレクトの正常な動作ですか?それとも、私の元のリファラーが削除されhttp://www.example.com/pageB.jspますか?それは望ましくないでしょう。

違いがあるかどうかはわかりませんが、JSPで作業してresponse.sendRedirect()おり、302リダイレクトの実行に使用しています。

私はこれを使って実験を行ったこと、そして元のリファラー文字列(http://www.othersite.com/pageA.jsp)を保持しているように見えますが、これが通常のデフォルトの動作であり、私の奇妙なものではないことを確認したかっただけです。


私は現在302リダイレクトを使用していますが、おそらく301リダイレクトを代わりに使用できます。301リダイレクトの動作がより信頼できるかどうか知っていますか?


3
私はちょうど反対が必要です。リダイレクトのリファラーを変更する(つまり、元のリファラーを削除する)サーバー側リダイレクトを実行します。誰でも?
cprcrack 2013年

回答:


32

短い答えは、Refererヘッダーまたは302ステータスコードのいずれについても、関連するRFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.36で指定されていないことです。

あなたの最善の策は、いくつかのブラウザでテストを行い、コンセンサス行動があるかどうかを確認することです。

完全なベルトとブレースの場合は、元のリファラーをリダイレクトURLにエンコードして、確実に取得できるようにします。


17
それは興味がある可能性が誰に、私は、主要なブラウザにSPMEテストをしました:stackoverflow.com/questions/2158283/...
マルコDemaio

121

302についてはわかりませんが、本日一部のブラウザで301をテストしました。結果は次のとおりです。

シナリオ:ユーザーがdomainXでdomainAを指すリンクをクリックします。domainAはdomainBへの301リダイレクトを行います。

  • refererdomainBに到達したときのIE8 は次のとおりです。
  • refererdomainBに到達したときのSafari4 は:domainX(ユーザーが新しいタブでリンクを開いた場合でも)
  • FF3.6.10 refererに着陸した場合):domainX(ユーザーが新しいタブでリンクを開いた場合でも)
  • domainBに到達したrefererときのChrome5はdomainX(ユーザーが新しいタブでリンクを開いていない限り
  • domainBに到達したrefererときのChrome26はdomainX(ユーザーが新しいタブでリンクを開いた場合でも)

27
注:このテストは少し前に実行されました。現在、Chrome 26は新しいタブで開いた場合でも同じように動作します
ベンジャミン

すべてのブラウザでテストされたわけではありませんが、302の動作は同じようです。
Amir Ali Akbari 2017年

注:リダイレクトページ(domainA)がReferrer-Policy:no-referrerヘッダーを発行した場合、Chrome(およびOpera)は 宛先ページ(domainB)へのリクエストにRefererヘッダーを設定しません。FirefoxとEdgeはまだそれを送信します。
DavidBalažic19年

12

良い質問。この場合、リファラーの送信は完全にブラウザーに依存します(ブラウザーは新しいリソースに対して別の要求を行うように指示されているため)。

RFC 2616はこの問題について沈黙を守っています

リクエストされたリソースは一時的に別のURIに存在します。リダイレクトは時々変更される可能性があるため、クライアントは今後のリクエストに引き続きRequest-URIを使用する必要があります(SHOULD)。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

私はブラウザが正しいリファラーを一緒に送ることを信用しません。私は他のものとは異なる何かを送信する少なくとも1つはあるに違いない。

回避策

可能であれば、?override_referer=<old_url>リダイレクト先のURLにパラメータを追加して、HTTP_REFERERではなくその値を解析してください。

そうすれば、常に正しい結果を確実に得ることができ、セキュリティで何も失うことはありません。リファラーはどちらの方法でも偽造できます。


4
実際には、URLでリファラーをオーバーライド可能にすることにより、セキュリティ上の何かを失っています。最近のほとんどのブラウザーでは、AJAXリクエストのリファラーをJavaScript経由で変更することはできません。ただし、URLは明らかにできます。これは、XSS攻撃が発生した場合、リファラーはURLパラメーターよりも信頼できることを意味します。誤解しないでください。リファラーは完全に信頼できないユーザー入力です。しかし、URLを変更するよりも、他人にそのデータを偽装するほうがはるかに困難です。
phylae

6

私は反対の問題を抱えていました:リファラーが「pageB」であることを望みましたが、現在のブラウザはこのように処理しません...

だから私はpageBでHTMLリダイレクトを試してみました(301または302リダイレクトの代わりに):

<meta http-equiv="refresh" content="0; url=pageC.jsp" />

そして結果は驚くべきものでした:

  • リファラーはChromeのpageBです
  • リファラーはFireFoxとIEで空です!

これが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.