web-dev-qa-db-ja.com

Request.UrlReferrer null?

Aspx C#.NETページ(フレームワークv3.5を実行しています)では、ログインしないとページを表示できないため、ユーザーの出身地を知る必要があります。ページA(ユーザーのページ)がある場合表示したい)ページB(ログインページ)にリダイレクトし、Request.UrlReferrerオブジェクトがnullです。

背景:ユーザーがログインしていない場合は、ログインページ(このシナリオではB)にリダイレクトします。ログイン後、強制的にログインする前に、リクエストしていたページに戻したいと思います。

更新:
素早い解決策は次のようです。
//if user not logged in Response.Redirect("..MyLoginPage.aspx?returnUrl=" + Request.ServerVariables["SCRIPT_NAME"]);
[。

19
Mario

標準のメンバーシッププロバイダーを使用し、ディレクトリ/ページの承認を設定すると、コードは自動的にReturnUrlのクエリパラメーターを設定し、ログインが成功するとリダイレクトします。

メンバーシッププロバイダーパターンを使用したくない場合は、クエリ文字列パラメーターも手動で実行することをお勧めします。 HTTPリファラーはあまり信頼できません。

11
Jon Adams

UrlReferrerは、ブラウザが送信する必要がある HTTP_REFERER ヘッダーに基づいています。しかし、クライアントに任されているすべてのものと同様に、それは可変です。

一部の「セキュリティ」スイート(ノートンのインターネットセキュリティなど)は、ユーザーの行動の追跡に役立つと信じて、そのヘッダーを削除することを知っています。また、同じことをするためのFirefox拡張機能がいくつかあると確信しています。

要するに、あなたはそれを信用すべきではないということです。 GET文字列にURLを追加し、それに基づいてリダイレクトするだけです。

更新:コメントで述べたように、GETパラメータからのリダイレクトを、ドメインのない相対リンク、拒否ディレクトリパターン(../)などでのみ機能するように制限することをお勧めします。したがって、リダイレクトをサニティチェックします。標準の「ユーザーが入力した入力を盲目的に使用しない」ルールに従う場合は、安全であるはずです。

29
Mark Brackett

この問題は、ユーザーを他のページにリダイレクトする方法に関連している可能性があります。とにかく、リファラーURLは絶対的なルールとしてとるべきものではありません-クライアントはそれを簡単に偽造することができます。

2
hangy

探しているのは、クエリ文字列変数(returnURLやoriginURLなど)を使用するのが最適です。リファラーは信頼性が非常に低いため、データマイニング操作に最適です。

例については、ASP.Netがログインを使用してリダイレクトする方法を参照してください。

2
Orion Adrian