URL路由,图像处理程序和"潜在危险的Request.Path值"

Jam*_*mes 41 .net vb.net asp.net web-config httphandler

我已经在很长一段时间内遇到过这个问题,并且已经决定尝试通过在这里发布问题来一劳永逸地找到它的底部.我在这里的.net 4网站上有一个图像处理程序:

https://www.amadeupurl.co.uk/ImageHandler.ashx?i=3604 (为隐私而删除了实际域名)

现在这个工作正常,并且没有问题地从Web服务器提供图像,我说没有问题,因为如果我访问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
Run Code Online (Sandbox Code Playgroud)

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

routes.Ignore("{resource}.ashx")
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我会收到错误或者还有什么可以尝试.

Kam*_*eri 94

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

< > * % & : \ ?

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

<system.web>
    <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

或者回到.Net 2.0验证:

<system.web>
    <httpRuntime requestValidationMode="2.0" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

一个非常常见的无效字符是%,所以如果有任何机会(攻击,网络爬虫,或只是一些非标准的浏览器),网址被转义,你得到这个:

www.amadeupurl.co.uk/ImageHandler.ashx/%3Fi%3D3604
Run Code Online (Sandbox Code Playgroud)

而不是这个:

www.amadeupurl.co.uk/ImageHandler.ashx/?i=3604
Run Code Online (Sandbox Code Playgroud)

请注意,这%3F是转义字符?.Asp.Net请求验证程序将该字符视为无效并抛出异常:

A potentially dangerous Request.Path value was detected from the client (?).
Run Code Online (Sandbox Code Playgroud)

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

这是一篇关于请求验证以及如何处理它的好文章

  • 使用requestPathInvalidCharacters时,如果出现以下错误,请使用requestPathInvalidCharacters ="&lt;,>,*,%,&amp;,\,?" 相反:字符'<',十六进制值0x3c在XML属性值中是非法的. (13认同)