这个问题我已经经历了很长一段时间了,我决定通过在这里张贴这个问题进行一些思考,试图一劳永逸地弄清这个问题的真相.我在.NET4网站中有一个图像处理程序,位于以下位置:

https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604

现在,它工作得很好,从Web服务器提供图像没有问题,我说没有问题,因为如果我访问URL,它工作得很好,图像加载,不会产生任何异常.但是,昨天确实有人访问了此URL,并引发了如下异常:

Exception Generated
Error Message:
A potentially dangerous Request.Path value was detected from the client (?).
Stack Trace:
at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

Technical Information:
DATE/TIME: 23/01/2013 03:50:01
PAGE: www.amadeupurl.co.uk/ImageHandler.ashx?i=3604

我理解错误信息,这不是一个问题,我只是不明白为什么会在这里生成它,更糟的是,我无法复制它,就像我说的,我点击了图片加载的链接,没有例外.我正在使用URL路由,并注册了处理程序,以防这导致以下代码出现问题:

routes.Ignore("{resource}.ashx")

我不确定我为什么会出错,或者还有什么可以try 的.

推荐答案

Asp.Net 4.0+附带了一个非常严格的内置请求验证,其中一部分是url中可能用于XSS攻击的潜在危险字符.以下是url中的默认无效字符:

< > * % & : \ ?

您可以在配置文件中更改此行为:

<system.web>
    <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>

或者回go .Net 2.0验证:

<system.web>
    <httpRuntime requestValidationMode="2.0" />
</system.web>

一个非常常见的无效字符是%,因此如果偶然(攻击、网络爬虫程序或只是某个非标准浏览器)对URL进行转义,您会得到以下结果:

www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604

而不是这个:

www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604

请注意,%3F?的转义字符.Asp认为该字符无效.Net请求验证程序并引发异常:

A potentially dangerous Request.Path value was detected from the client (?).

虽然在错误消息中,您会看到字符(%3F)的未转义版本,它再次是?

Here's a good article按请求验证以及如何处理

Asp.net相关问答推荐

调用context.Users和context.Set User有什么区别?

502 DotNet WebApplication的网关nginx已损坏

Swashbuckle 通过 .NET 应用程序中的 XML 注释使用格式标识符

如何异步渲染局部视图

使 ASP.NET WCF 将字典转换为 JSON,省略键和值标签

HttpResponse 的区别:SetCookie、AppendCookie、Cookies.Add

如何判断 IIS 是处于 32 位还是 64 位模式

在 Asp.net 中通过 Button 的 CommandArgument 传递多个参数

如何在 Kendo UI 中获取下拉列表中选定项目的文本?

显示单选按钮列表内联

为什么aspx文件会返回404(找不到页面)

用于呈现

如何从 Web API 应用程序返回 PDF

由于文件路径太长,网站发布失败

当.NET抛出WebException((400)错误请求)时如何处理WebResponse?

Cache.Add 绝对过期 - 是否基于 UTC?

ASP.NET 应用程序状态与静态对象

global.asax 中的 Application_Error 未捕获 WebAPI 中的错误

如何将 GridView.DataSource 导出到数据表或数据集?

判断 IQueryable 结果集的最佳方法是什么?