是否可以覆盖页面的ValidateRequest设置?

时间:2009-01-28 03:40:59

标签: asp.net-mvc

我有一个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,对吧?我错过了什么?

4 个答案:

答案 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:

http://social.technet.microsoft.com/wiki/contents/articles/windows-identity-foundation-wif-a-potentially-dangerous-request-form-value-was-detected-from-the-client-wresult-quot-lt-t-requestsecurityto-quot.aspx

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”。