validaterequest net false asp asp.net-mvc

asp.net-mvc - false - validaterequest asp net 4



¿Se puede anular la configuración ValidateRequest de una página? (4)

Tengo un formulario ASP.NET MVC que puede (por lo general lo hace) enviar una respuesta que desencadenaría el error "Se detectó un valor de Request.Form potencialmente peligroso desde el cliente".

Para tratar de evitar esto, he colocado ValidateRequest = "false" en la directiva de la página.

El único problema: ¡sigo recibiendo el error!

Ahora, todo estuvo bien hasta que actualicé a ASP.NET MVC RC esta mañana, y (de acuerdo con el archivo léame), coloqué lo siguiente en las vistas 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>

Entonces, validateRequest debería ser falso para todas las páginas, ¿verdad? ¿Qué me estoy perdiendo?


Tenemos un controlador base del que nuestros controladores heredan, lo que nos permite desactivar globalmente la validación intrínseca de solicitudes ASP.NET:

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

¡Solo asegúrese de validar todas las entradas del cliente!


Es necesario decorar el controlador o la acción con el atributo [ValidateInput (false)] y agregar requestValidationMode = "2.0" al archivo web.config: Ejemplo:

El controlador:

[ValidateInput(false)] public class MensajesController : Controller { //or in an action [ValidateInput(false)] [HttpPost] public ActionResult Create(FormCollection collection) { } }

El archivo de configuración:

<configuration> <system.web> <httpRuntime requestValidationMode="2.0"/> </system.web> </configuration>


Tuve un problema similar al utilizar ASP.NET MVC 3 con .NET 4.0 y el Servicio de control de acceso de Windows Azure v2, donde obtendría el error:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult="<t:RequestSecurityTo...").

y descubrió que una solución mejor que desactivar la validación era implementar un RequestValidator personalizado como se describe en este artículo:

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 ); } }

El único motivo por el que miré más allá de desactivar la validación fue porque lo había visto funcionar sin desactivar la validación al seguir este tutorial en el Kit de capacitación de la plataforma de Windows Azure:

http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToACSLabsV2

De todos modos, con suerte, esto será útil para alguien y podría proporcionar un enfoque más detallado para resolver este problema en el futuro. Cabe señalar que RequestValidationMode = "2.0" no es necesario si implementa el RequestValidator personalizado.


En MVC, la validación tiene lugar en el nivel del controlador, no en el nivel de la página. Para ver por qué ocurre esto, considere que en el momento en que se está ejecutando la acción del controlador, no sabemos qué vista se elegirá para representar. (De hecho, ¡es posible que la acción del controlador ni siquiera represente una vista!) En su lugar, podría abrir una solicitud de descarga de archivo en el cliente). Además, si un usuario envía una entrada maliciosa al servidor, al demasiado tarde para hacer algo al respecto. El controlador ya habrá cometido la entrada peligrosa a la base de datos.

En su lugar, decore el controlador o la acción con el atributo [ValidateInput (false)]. Esto nos obligará a suprimir la validación de solicitud para ese controlador o acción.