2012-02-02 14 views
5

Tengo una aplicación MVC3 que tiene un HandleErrorAttribute personalizado para poder enviar el error por correo electrónico. A menudo obtengo el "Se detectó un valor Request.Form potencialmente peligroso del cliente", pero solo muestra los primeros caracteres del valor del formulario que causó la excepción. Me gustaría ver el valor completo del formulario que se ingresó para tratar de obtener una mejor idea si la entrada fue maliciosa o accidental por un usuario. Sin embargo, cuando intento extraer los valores de forma en HandleErrorAttribute, arroja el mismo error. ¿Alguna idea de cómo obtener los valores de formulario de Request.Form sin causar la validación en mi controlador de excepciones?¿Cómo obtengo el valor del formulario que provocó el "Se detectó un valor Request.Form potencialmente peligroso desde el cliente" en MVC?

public class HandleErrorLogAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     base.OnException(context); 

     //Record Error 
     string errorDetails = HttpUtility.HtmlEncode(context.Exception.ToString()); 

     // Throws "otentially dangerous..." error here 
     foreach (var key in context.RequestContext.HttpContext.Request.Form.AllKeys) 
     { 
      errorDetails += key + "=" + HttpUtility.HtmlEncode(context.RequestContext.HttpContext.Request.Form[key]); 
     } 

     // Send Email with errorDetails 
    } 
} 
+1

Puede usar '[ValidateInput (false)]' y validarlo usted mismo. –

+0

Está bien que genere un error, solo quiero saber qué entrada lo causó. Traté de agregar [ValidateInput (false)] a mi método OnException, pero todavía rehice el error. – Austin

+0

Bueno, 'ValidateInput' en realidad no" funciona "para esto, al menos no por sí mismo. [Aquí está el por qué.] (Http://stackoverflow.com/questions/807662/why-is-validateinputfalse-not-working/2530823#2530823) El verdadero problema aquí es que no hay una manera segura de hacer esto que solo afectará a uno acción. Es una configuración global que afecta a toda la aplicación. –

Respuesta

12

En ASP.NET 4.5, usted será capaz de utilizar la nueva HttpRequest.Unvalidated.Form propiedad.

Hasta entonces, se puede utilizar la reflexión para leer el campo privado HttpRequest._form:

HttpRequest request = context.RequestContext.HttpContext.Request; 
NameValueCollection form = (NameValueCollection)request.GetType().InvokeMember(
    "_form", 
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, 
    null, request, null); 

Tenga en cuenta que se _form perezosamente inicializado por la propiedad HttpRequest.Form, así que asegúrese de HttpRequest.Form ha sido visitada al menos una vez con anterioridad.

+0

Es bueno saberlo, gracias. – Austin

+0

No sabía acerca de HttpRequest.Unvalidated.Form hasta hace poco. Gracias. –

Cuestiones relacionadas