我已经在很长一段时间内遇到过这个问题,并且已经决定尝试通过在这里发布问题来一劳永逸地找到它的底部。我在.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
我理解错误信息,这不是问题我只是不明白为什么会在这里生成,更糟糕的是我无法复制它,就像我说我点击图片链接一样加载,也不例外。我正在使用URL路由并注册处理程序,以防万一这导致以下代码出现问题:
routes.Ignore("{resource}.ashx")
我不确定为什么我会收到错误或者还有什么可以尝试。
答案 0 :(得分:92)
Asp.Net 4.0+附带了非常严格的内置请求验证,其中一部分是url中可能用于XSS攻击的潜在危险字符。以下是网址中的默认无效字符:
< > * % & : \ ?
您可以在配置文件中更改此行为:
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,\,?" />
</system.web>
或者回到.Net 2.0验证:
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
一个非常常见的无效字符是%
,因此如果有任何机会(攻击,网页抓取工具或只是某些非标准浏览器),网址都会被转义,你就会得到这个:
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以及如何处理
答案 1 :(得分:0)
即使我遇到了这个问题,但对我来说,我不小心输入了&而不是?在网址
中例如:
example.com/123123¶meter1=value1&paameter2=value2
但实际上它必须是:
example.com/123123?parameter1=value1&paameter2=value2
答案 2 :(得分:0)
一个超级古老的线程,但这有效:
return RedirectToAction("MyAction", new { @myParameterName = "MyParameterValue" });
如果请求将发送到不同的控制器,您还可以在操作名称之后添加控制器名称,并且还可以通过将它们之间用逗号链接来添加更多查询字符串参数。