【问题标题】:Can a page's ValidateRequest setting be overridden?可以覆盖页面的 ValidateRequest 设置吗?
【发布时间】:2010-10-03 22:31:29
【问题描述】:

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

【问题讨论】:

  • Views web.config 仅适用于直接浏览 Views 文件夹时,对吧?

标签: asp.net-mvc


【解决方案1】:

在 MVC 中,验证发生在控制器级别,而不是页面级别。要了解为什么会这样,请考虑在执行控制器操作时,我们不知道将选择哪个视图来呈现。 (事实上​​,控制器操作甚至可能根本不渲染视图!它可能会在客户端打开文件下载提示。)此外,如果用户向服务器提交恶意输入,则在渲染视图时它已经为时已晚,对此无能为力。控制器已经将危险输入提交到数据库。

请改为使用属性 [ValidateInput(false)] 来装饰控制器或动作。这将导致我们禁止对该控制器或操作进行请求验证。

【讨论】:

  • +1 不仅提供了答案,还提供了它为何如此运作。知道如何做某事总是好事,但知道为什么做某事总是更好
【解决方案2】:

需要用属性 [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>

【讨论】:

  • 是的,需要为 .NET 4 设置 requestValidationMode。感谢更新。
【解决方案3】:

我们的控制器继承自一个基本控制器,允许我们全局禁用内部 ASP.NET 请求验证:

    protected override void Initialize(RequestContext requestContext)
    {
        // no client input will be checked on any controllers
        ValidateRequest = false;
        base.Initialize(requestContext);
    }

只需确保您验证来自客户端的所有输入

【讨论】:

    【解决方案4】:

    我在使用带有 .NET 4.0 和 Windows Azure 访问控制服务 v2 的 ASP.NET MVC 3 时遇到了类似的问题,我会收到错误:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多