检测到ASP.NET MVC 5危险的Request.Path

时间:2015-07-17 13:58:51

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我在ASP.NET MVC 5中遇到了一个相当普遍的问题,它会在无效的网址字符上引发例外,例如&%

我从其他堆栈溢出问题中尝试了很多不同的建议,例如herehere。但是,将其添加到我的Web.config中并不起作用:

<system.web>
    <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,%,:,\,?"
                 requestValidationMode="2.0"/>
</system.web>  

也没有在我的控制器方法之上添加[HttpValidate(false)]

我在寻找解决方案时发现了这个gem,看起来很有希望,但即使这样也行不通。网址请求不会被该网站的代码更改,这让我想知道问题是否在ASP.net甚至有机会采取行动之前发生。

我试图避免手动编码我的所有请求,但如果这是我必须做的事情,那么我想我别无选择。

如果有帮助,请查看我的堆栈跟踪:

  

[HttpException(0x80004005):从客户端(&amp;)检测到一个潜在危险的Request.Path值。]

     

System.Web.HttpRequest.ValidateInputIfRequiredByConfig()+9693412      System.Web.PipelineStepManager.ValidateHelper(HttpContext context)+53

1 个答案:

答案 0 :(得分:1)

我在 Web-Form 应用程序中遇到了这个错误,它通常是由传递给Controller的特殊字符引起的。最简单的分辨率,确保您的数据在到达控制器之前被正确编码。这将是最安全的方法,但是如果您想要快速而肮脏的方法,可以通过web.config将安全性稍微放宽到 Page / View

<!-- Example: 'Web-Config' -->
<location path="test.aspx">
  <system.web>
    <httpRuntime requestValidationMode="2.0" />
  </system.web>
</location>

以上做了以下内容:

  

在任何一种情况下,您都必须在Web.config文件中进行两处更改。该   第一个更改是设置requestValidationMode属性   httpRuntime元素为&#34; 2.0&#34;。此设置进行请求验证   稍后在请求处理事件的序列中发生。那个设定   对于使用ASP.NET 4及更高版本的应用程序是必需的,因为as   在ASP.NET 4中,请求验证在请求的早期发生   生命周期比以前的ASP.NET版本。

否则你可以简单地使用:

HttpUtility.HtmlDecode("...");
HttpUtility.HtmlEncode("...");

上述目的:

  

如果在HTTP中传递空格和标点符号等字符   流,他们可能会在接收端被误解。 HTML   编码将HTML中不允许的字符转换为   字符实体等价物; HTML解码反转了编码。对于   例如,当嵌入在文本块中时,字符&lt;和&gt;是   编码为&lt;和&gt;用于HTTP传输。

您还可以查找UrlEncodeUrlDecode