我有一个ASP.NET MVC表单,可能(通常会)提交一个响应,触发“从客户端检测到一个潜在危险的Request.Form值”错误。
为了解决这个问题,我在页面指令中放置了一个ValidateRequest =“false”。
唯一的问题:我仍然收到错误!
现在,直到今天早上我更新到ASP.NET MVC RC,并且(根据自述文件),将以下内容放在Views web.config中
<pages validateRequest="false"
pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<controls>
<add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
</controls>
</pages>
因此,对于所有页面,validateRequest都应为false,对吧?我错过了什么?
答案 0 :(得分:62)
在MVC中,验证发生在控制器级别,而不是页面级别。要知道这是为什么,请考虑在执行控制器操作时,我们不知道将选择哪个视图进行渲染。 (事实上,控制器操作甚至可能根本不呈现视图!它可能会在客户端上打开文件下载提示。)此外,如果用户向服务器提交恶意输入,则在呈现视图时它是为时已晚,无所事事。控制器已经将危险的输入提交给数据库。
相反,请使用属性[ValidateInput(false)]修饰控制器或操作。这将导致我们取消对该控制器或操作的请求验证。
答案 1 :(得分:17)
它需要使用属性[ValidateInput(false)]来装饰控制器或动作,并将requestValidationMode =“2.0”添加到web.config文件中: 例如:
控制器:
[ValidateInput(false)]
public class MensajesController : Controller
{
//or in an action
[ValidateInput(false)]
[HttpPost]
public ActionResult Create(FormCollection collection)
{
}
}
配置文件:
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0"/>
</system.web>
</configuration>
答案 2 :(得分:2)
我们有一个控制器继承的基本控制器,允许我们全局禁用内部ASP.NET请求验证:
protected override void Initialize(RequestContext requestContext)
{
// no client input will be checked on any controllers
ValidateRequest = false;
base.Initialize(requestContext);
}
只需确保您验证来自客户端的所有输入!
答案 3 :(得分:2)
我使用ASP.NET MVC 3和.NET 4.0以及Windows Azure Access Control Service v2时遇到了类似的问题,我会收到错误:
System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult="<t:RequestSecurityTo...").
并发现一个比关闭验证更好的解决方案是实现本文所述的自定义RequestValidator:
public class SampleRequestValidator : RequestValidator
{
protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex )
{
validationFailureIndex = 0;
if ( requestValidationSource == RequestValidationSource.Form && collectionKey.Equals( WSFederationConstants.Parameters.Result, StringComparison.Ordinal ) )
{
SignInResponseMessage message = WSFederationMessage.CreateFromFormPost( context.Request ) as SignInResponseMessage;
if ( message != null )
{
return true;
}
}
return base.IsValidRequestString( context, value, requestValidationSource, collectionKey, out validationFailureIndex );
}
}
我进一步关注验证的唯一原因是因为我在Windows Azure平台培训套件中遵循本教程时看到了这一点而没有关闭验证:
http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToACSLabsV2
无论如何,希望这对某人有用,并且可能会提供更细粒度的方法来解决这个问题。应该注意的是,如果实现自定义RequestValidator,则不需要requestValidationMode =“2.0”。