6

この質問とそこの回答に基づいて、リダイレクトの適切な方法を尋ねたいと思います。

Redirect(url, endResponse)を使用するデフォルトの方法は、メソッドを呼び出すThreadAbortExceptionことで呼び出されるため、スローされるため、try/catch ブロック内で使用すると、この例外が表示され、エラーと見なすことができますが、実際にはユーザーは、残りのページ処理を停止してページにリダイレクトしようとします。endResponse=trueEnd()

他の可能な方法は、例外を取得しないことを使用してRedirect(url, endResponse)endResponse=false次のように呼び出すことです。HttpContext.Current.ApplicationInstance.CompleteRequest();

したがって、問題は、どちらを使用する方が良いか、そしてその理由です。

4

2 に答える 2

5

常にリダイレクトを呼び出す必要があります。そうしないと、endRespose=trueハッカーがリダイレクトを保持するだけでページの内容を確認できます。

リダイレクトを保持するために Firefox用のNoRedirectプラグインを使用していることを証明するため。次に、2 つのケースをテストします。結果は次のとおりです。

そのテキストを含む単純なページがあります

<form id="form1" runat="server">
<div>
I am making a redirect - you must NOT see this text.
</div>
</form>

次に、ページの読み込み時に、両方のケースでリダイレクトを試みます。

最初のケースでは、Complete Request(); を使用します。

    try
    {
        // redirect with false that did not throw exception
        Response.Redirect("SecondEndPage.aspx", false);
        // complete the Request
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    catch (Exception x)
    {

    }

そしてそこにブームが来て、あなたはページの中身を見ることができます!

そして2番目のケース

try
{
    // this is throw the ThreadAbortException exception
    Response.Redirect("SecondEndPage.aspx", true);
}
catch (ThreadAbortException)
{
    // ignore it because we know that come from the redirect
}
catch (Exception x)
{

}

現在何も表示されていません。

したがって、ハッカーにページの内容を知られたくない場合は、endResponse を true にして呼び出し、他の処理を停止する必要があります。たとえば、関数から戻り、続行しないでください。

たとえば、ユーザーが認証されているかどうかを確認すると、そのページが表示されるか、認証されていない場合はログインにリダイレクトする必要があります。ログインでも、endResponse を使用して false にリダイレクトしようとすると、ハッカーが表示できるリダイレクトを保持します。リダイレクトを使用しているため、それはできないと考えています。

ここでの私の基本的なポイントは、ブラウザにデータを送り返すことを止めない場合に存在するセキュリティ スレッドを示すことです。リダイレクトはヘッダーであり、ブラウザーへの指示ですが、同時に他のデータの送信を停止する必要があり、ページの他の部分の送信を停止する必要があります。

于 2013-02-01T06:49:36.347 に答える