重定向到一个页面,endResponse为true VS CompleteRequest和安全线(R

2019-07-19 02:50发布

立足这一问题有答案 ,我想问的是转向的正确方法。

使用默认的方式重定向(URL,endResponse)是抛出ThreadAbortException ,因为被称为与endResponse=true调用End()方法,因此,如果您使用它一个try / catch块,这显示有异常 ,并能被假定为错误,但实际上用户是试图通过停止页面处理的其余部分重定向到一个页面。

另一可能的方法是调用Redirect(url, endResponse)endResponse=false由以下HttpContext.Current.ApplicationInstance.CompleteRequest(); 通过使用你没有得到任何异常。

所以,问题是什么是更好的使用和为什么。

Answer 1:

你必须随时拨打重定向endRespose=true ,否则任何黑客就可以看到最新通过简单的保持重定向页面上。

为了证明我使用NoRedirect插件的Firefox持有重定向。 然后,我测试两种情况,这里是结果:

我有一个里面是文本的简单页面

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

然后在页面加载尽量使重定向与这两种情况下:

第一种情况,使用完成请求();

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

    }

有热潮,你可以看到最新的页面里面!

而第二种情况

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真把它和停止其他什么加工制成的功能-例如,返回和无法继续。

例如,如果你检查,如果用户通过验证,他可以看到,页面或如果不是他必须重定向到登录,甚至在登录,如果你试图给他重定向与endResponse为false,然后抱着重定向黑客就可以看到 - 什么你认为,不能因为你使用重定向。

在这里的基本观点是要表明存在,如果你不停止发送数据返回给浏览器的安全线。 重定向是一个头和指令的浏览器,但你需要停止发送任何其他数据的同时,你必须停止发送你的页面的任何其他部分。



Answer 2:

它不需要调用Response.RedirecttrueendResponse解决输出重定向的呼叫后,页面内容的安全性问题。 你可以做到这一点的另一种方式,避免在同一时间产生一个ThreadAbortException( 这始终是坏 )。 下面是我用5个按钮,导致以不同方式创建重定向页面片段中, RedirectRenderOverride按钮是理想,因为它是触发Render方法什么都不做的人。 这已经过测试与NoRedirect加载项。 只有两种情况避免输出以外的302对象移动响应任何东西- RedirectEndRedirectRenderOverride

代码在前面

<asp:Button ID="Button1" runat="server" OnClick="RedirectCompleteRequest" Text="RedirectCompleteRequest"/>
<asp:Button ID="Button2" runat="server" OnClick="RedirectClear" Text="RedirectClear"/>
<asp:Button ID="Button3" runat="server" OnClick="RedirectRenderOverride" Text="RedirectRenderOverride"/>
<asp:Button ID="Button4" runat="server" OnClick="RedirectEnd" Text="RedirectEnd"/>
<asp:Button ID="Button5" runat="server" OnClick="RedirectEndInTryCatch" Text="RedirectEndInTryCatch"/>

后面的代码

public partial class _Default : Page {
    private bool _isTerminating;

    protected void RedirectEnd(object sender, EventArgs e) { Response.Redirect("Redirected.aspx"); }

    protected void RedirectCompleteRequest(object sender, EventArgs e)
    {
        Response.Redirect("Redirected.aspx", false);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

    protected void RedirectClear(object sender, EventArgs e)
    {
        Response.Clear();
        Response.Redirect("Redirected.aspx", false);
    }

    protected void RedirectRenderOverride(object sender, EventArgs e)
    {
        Response.Redirect("Redirected.aspx", false);
        _isTerminating = true;
    }

    protected void RedirectEndInTryCatch(object sender, EventArgs e)
    {
        try {
            Response.Redirect("Redirected.aspx");
        } catch (ThreadAbortException) {
            // eat it
        } finally {
            Response.Write("Still doing stuff!");
        }
    }

    protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
    {
        if (!_isTerminating) {
            base.RaisePostBackEvent(sourceControl, eventArgument);
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (!_isTerminating) {
            base.Render(writer);
        }
    }
}

Response.End调用Thread.CurrentThread.Abort内部,并根据埃里克利珀 ,调用Thread.Abort ,“充其量是指示不好的设计,可能是不可靠的,极其危险的。”



文章来源: Redirect to a page with endResponse to true VS CompleteRequest and security thread