我在ASP.NET MVC 5中遇到了一个相当普遍的问题,它会在无效的网址字符上引发例外,例如&
和%
。
我从其他堆栈溢出问题中尝试了很多不同的建议,例如here和here。但是,将其添加到我的Web.config中并不起作用:
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,%,:,\,?"
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
答案 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传输。
您还可以查找UrlEncode
和UrlDecode
。