MVC - CustomErrors在设置redirectMode =“ResponseRewrite”时不起作用

时间:2010-09-23 14:46:04

标签: security asp.net-mvc-2

我有一个在IIS 6.0上运行的ASP.NET 4.0 MVC Web应用程序,其中包含webconfig自定义错误部分:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Home/Error">
  <error statusCode="403" redirect="/Home/Error"/>
  <error statusCode="404" redirect="/Home/Error"/>
</customErrors>

和一个看起来像这样的error.aspx页面:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>

<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Error
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Error Processing your request.</h2>

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="Scripts" runat="server">
    <script runat="server">
       void Page_Load() {
          byte[] delay = new byte[1];
          RandomNumberGenerator prng = new RNGCryptoServiceProvider();

          prng.GetBytes(delay);
          Thread.Sleep((int)delay[0]);

          IDisposable disposable = prng as IDisposable;
          if (disposable != null) { disposable.Dispose(); }
        }
    </script>
</asp:Content>

每当我在webconfig自定义错误部分中包含上述“redirectMode =”ResponseRewrite“”时,重定向到我的自定义错误页面不再有效,并且我得到“服务器错误”/“应用程序中的页面错误 - 资源不能是发现”。实际上,控制器动作也被忽略。当我采取这种设置时,我们的一切都按照预期运作。我正在尝试将Scott Gu的解决方法纳入此处列出的Asp.net安全漏洞:http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

非常感谢任何帮助。 谢谢, 比利

3 个答案:

答案 0 :(得分:2)

我在MVC应用程序上尝试实现此问题时遇到的问题是我们使用的MVC URL需要路由才能作为defaultRedirect。不幸的是,因为正在使用ResponseRewrite redirectMode执行server.transfer,所以这不起作用。相反,我必须将错误url直接指向aspx文件。此外,您无法再访问会话,这是人们在使用ResponseRewrite redirectMode时遇到的另一个常见问题。

答案 1 :(得分:1)

很遗憾,根据Scott Guthrie的说法,<error>区域内不能包含任何<customErrors>个标签。他们肯定会在修补程序上工作,但与此同时,你必须使用一个非常简单的<customErrors>部分,如下所示:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" />

答案 2 :(得分:0)

我正在寻找同样的答案。然而,安德森先生的回答并不准确。斯科特建议响应代码的同质性。他们的.vbs测试脚本可以查找几个条件。 404和500错误代码都是他寻找重定向的全部内容。如果它们是相同的,脚本很高兴。如果一个为null,则另一个必须与默认重定向匹配。同样,这测试了同质性。只要您的404和500响应无法区分,他的脚本就会对您的代码进行绿灯处理。

ResponseRewrite的值似乎是绕过了IIS返回的302响应。我认为302可以在任何处理404或500错误之前返回,并向攻击者提供时间信息。我不确定你能不能没有ResponseRewrite(而且微软肯定说你不能。)