HTTP 模块拦截请求并破坏自定义错误配置
HTTP Module intercept requests and breaks custom errors configuration
我有一个 ASP.NET MVC 5 Web 应用程序,它在 IIS 8.5 上本地运行,部署后在 Azure 网站上运行 - 在这两种情况下,稍后将描述的行为是相同的。
我在 web.config 中配置了以下自定义错误页面管理(它涵盖了我所有的自定义错误案例,并且已经过测试并且运行良好):
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<clear />
<error statusCode="400" responseMode="ExecuteURL" path="/App/Error"/>
<error statusCode="403" responseMode="ExecuteURL" path="/App/Error/Forbidden" />
<error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound" />
<error statusCode="500" responseMode="ExecuteURL" path="/App/Error" />
</httpErrors>
</system.webServer>
此外,我在同一个 web.config 中配置了一个 HTTP 模块,如下所示:
<system.webServer>
<modules>
<add name="ImageProcessorModule" type="ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" />
</modules>
</system.webServer>
我遇到的问题是这样的:如果我向 .../c<
之类的奇怪 URL 发出请求,应用程序会按照 [=] 中的指示执行 500 自定义错误路径36=] 文件。
但是,如果我向陌生人 URL(模拟 html 标签)发出请求,例如 .../<c
,虽然结果错误是 500,但自定义错误不再执行,因为根据详细的错误,HTTP 模块拦截调用并且 "decides" 只显示 YSOD...
我收到的消息是:
A potentially dangerous Request.RawUrl value was detected from the client (="/App/
并且很容易看出这是由 web 模块引起的,因为堆栈跟踪:
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.RawUrl value was detected from the client (="/App/d__10.MoveNext() +201
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84
System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) +98
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +434
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288
如果我从 web.config 注释掉图像处理器模块,一切都会按预期运行。
为什么在这种情况下,自定义错误路径没有得到执行?
感谢您的宝贵时间和回答。
我非常怀疑这是 Image Processor 中的错误。
Client Dependency(Umbraco 的一个模块)中报告了完全相同的问题,虽然完全不相关,但相似之处在于它在请求管道的同一阶段访问 Context.Request.RawUrl
。
你有两个选择:-
找到一种方法来设置 runAllManagedModulesForAllRequests="false"
而不会影响您的 http 模块的行为
看看您是否可以向 https://github.com/JimBobSquarePants/ImageProcessor/blob/f4080c3217107eb7a571eb69e54cc5e69e1c892c/src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs 提交补丁以使用 Request.Unverified.RawUrl
而不是 Request.RawUrl
我有一个 ASP.NET MVC 5 Web 应用程序,它在 IIS 8.5 上本地运行,部署后在 Azure 网站上运行 - 在这两种情况下,稍后将描述的行为是相同的。
我在 web.config 中配置了以下自定义错误页面管理(它涵盖了我所有的自定义错误案例,并且已经过测试并且运行良好):
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<clear />
<error statusCode="400" responseMode="ExecuteURL" path="/App/Error"/>
<error statusCode="403" responseMode="ExecuteURL" path="/App/Error/Forbidden" />
<error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound" />
<error statusCode="500" responseMode="ExecuteURL" path="/App/Error" />
</httpErrors>
</system.webServer>
此外,我在同一个 web.config 中配置了一个 HTTP 模块,如下所示:
<system.webServer>
<modules>
<add name="ImageProcessorModule" type="ImageProcessor.Web.HttpModules.ImageProcessingModule, ImageProcessor.Web" />
</modules>
</system.webServer>
我遇到的问题是这样的:如果我向 .../c<
之类的奇怪 URL 发出请求,应用程序会按照 [=] 中的指示执行 500 自定义错误路径36=] 文件。
但是,如果我向陌生人 URL(模拟 html 标签)发出请求,例如 .../<c
,虽然结果错误是 500,但自定义错误不再执行,因为根据详细的错误,HTTP 模块拦截调用并且 "decides" 只显示 YSOD...
我收到的消息是:
A potentially dangerous Request.RawUrl value was detected from the client (="/App/
并且很容易看出这是由 web 模块引起的,因为堆栈跟踪:
[HttpRequestValidationException (0x80004005): A potentially dangerous Request.RawUrl value was detected from the client (="/App/d__10.MoveNext() +201 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +144 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +84 System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar) +98 System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +434 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288
如果我从 web.config 注释掉图像处理器模块,一切都会按预期运行。
为什么在这种情况下,自定义错误路径没有得到执行?
感谢您的宝贵时间和回答。
我非常怀疑这是 Image Processor 中的错误。
Client Dependency(Umbraco 的一个模块)中报告了完全相同的问题,虽然完全不相关,但相似之处在于它在请求管道的同一阶段访问 Context.Request.RawUrl
。
你有两个选择:-
找到一种方法来设置
runAllManagedModulesForAllRequests="false"
而不会影响您的 http 模块的行为看看您是否可以向 https://github.com/JimBobSquarePants/ImageProcessor/blob/f4080c3217107eb7a571eb69e54cc5e69e1c892c/src/ImageProcessor.Web/HttpModules/ImageProcessingModule.cs 提交补丁以使用
Request.Unverified.RawUrl
而不是Request.RawUrl