valor solucion referencia posible peligroso objeto mvc instancia form establecida error detectó como cliente c# .net asp.net asp.net-mvc vb.net

c# - solucion - se detectó un posible valor request.path peligroso en el cliente(>).



Cómo evitar HttpRequestValidationException en ASP.NET MVC que representa la misma vista que causó la excepción (6)

Con la última versión de ASP.NET MVC (el RC, en el momento de escribir esto) puede simplemente poner un atributo en su clase de controlador o su método de acción, por ejemplo:

[ValidateInput(false)] public ActionResult create() { // ...method body }

ValidateInputAttribute está en System.Web.Mvc.

Pero como otros han dicho, entonces debe realizar su propia validación o limpieza de entrada manual.

Con MVC 3, también debe asegurarse de que esté en su Web.config: <system.web><httpRuntime requestValidationMode="2.0" /></system.web>

Solo quiero saber cómo validar (o limpiar) la entrada del usuario en ASP.NET MVC para que no se genere una HttpRequestValidationException independientemente de los valores enviados. Por ejemplo, con una entrada de texto, si el usuario <BR/> , se producirá una excepción y se mostrará la pantalla amarilla de la muerte. No quiero eso. Quiero ver la excepción y hacer visible un error fácil de usar en la vista actual, preferiblemente con los controles cargados con los mismos valores enviados.

Encontré este http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html , pero es inútil para mi propósito. Además, encontré este http://msdn.microsoft.com/en-us/library/aa973813.aspx y traté de incluir una carpeta modelo pero no pude hacer que funcionase.


En ASP MVC 3 puede usar el atributo [AllowHtml] en campos / propiedades individuales en su Model / ViewModel para desactivar la validación solo para ese campo, lo cual es bastante agradable. Agregaré este atributo a ciertos campos en mi modelo, y luego AntiXSS la excelente biblioteca AntiXSS (también disponible a través de NuGet) para desinfectar la entrada del usuario llamando al Sanitizer.GetSafeHtmlFragment(mymodel.Description) (donde la propiedad "Descripción" es una propiedad de cadena en mi modelo de vista, que tiene el atributo [AllowHtml] aplicado)


En lugar de detectar el error en global.asax Application_Error, podría detectarlo agregando un controlador de errores para el controlador que detecta explícitamente este error y lo redirecciona a la vista con un mensaje de error y los datos de visualización apropiados.

Encontré esta post , algo antigua, sobre cómo hacer esto con atributos.


Para obtener un ejemplo muy detallado de cómo detectar esta (y otras) excepciones con un filtro, consulte: http://code.google.com/p/geochat/source/browse/Source/Web/GeoChat.MvcExtensions/ExceptionHandlerAttribute.cs

Esto le permitirá mantener la validación, pero evitar que el usuario vea la "pantalla amarilla de la muerte".

Esta es una versión simplificada (tal vez simplificada):

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true), AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)] public class ExceptionHandlerAttribute : FilterAttribute, IExceptionFilter { private HandleErrorAttribute attribute = new HandleErrorAttribute(); public ExceptionHandlerAttribute() { this.ExceptionType = typeof(Exception); this.Order = 1; } public string View { get { return attribute.View; } set { attribute.View = value; } } public Type ExceptionType { get { return attribute.ExceptionType; } set { attribute.ExceptionType = value; } } public void OnException(ExceptionContext filterContext) { if (this.ExceptionType.IsInstanceOfType(filterContext.Exception)) { string controller = (string)filterContext.RouteData.Values["controller"]; string action = (string)filterContext.RouteData.Values["action"]; if (controller == null) controller = String.Empty; if (action == null) action = String.Empty; HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controller, action); ViewResult result = new ViewResult(); result.ViewName = this.View; result.MasterName = String.Empty; result.ViewData = new ViewDataDictionary<HandleErrorInfo>(model); result.TempData = filterContext.Controller.TempData; filterContext.Result = result; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; } }

}


Ponga poner ValidateRequest = "false" en su declaración de vista aspx, pero desinfecte a los usuarios ingresen texto dentro de su código, para evitar algunos ataques xss.


ValidateInputAttribute es el método adecuado para deshabilitar la validación de solicitud. El método declarativo dentro de la vista (aspx) no funciona porque el controlador es responsable de recibir la solicitud (no ver / aspx).