2012-02-02 87 views
5

我有一个具有自定义HandleErrorAttribute的MVC3应用程序,以便我可以通过电子邮件发送错误。我经常得到“从客户端检测到潜在危险的Request.Form值”,但它只显示导致异常的表单值的前几个字符。我希望看到输入的整个表单值能够在用户输入是恶意的或意外的情况下尝试获得更好的想法。但是,当我尝试在HandleErrorAttribute中拉出表单值时,它会抛出相同的错误!任何想法如何从Request.Form中获取表单值而不会在异常处理程序中导致验证?如何在MVC中获取导致“从客户端检测到潜在危险的Request.Form值”的表单值?

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

你可以使用'[ValidateInput(false)]'并自己验证它。 – 2012-02-02 14:39:42

+0

这很好,它会产生一个错误,我只想知道输入是什么引起的。我尝试添加[ValidateInput(false)]到我的OnException方法,但它仍然重新抛出错误。 – Austin 2012-02-02 14:53:33

+0

那么,'ValidateInput'实际上并不“工作”,至少不是它本身。 [这是为什么。](http://stackoverflow.com/questions/807662/why-is-validateinputfalse-not-working/2530823#2530823)这里真正的问题是,没有安全的方法来做到这一点,只会影响一个行动。这是一个影响整个应用程序的全局设置。 – 2012-02-02 15:01:51

回答

12

在ASP.NET 4.5中,您将能够使用新的HttpRequest.Unvalidated.Form属性。

在那之前,你可以使用反射来读取私人HttpRequest._form领域:

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

注意_form是懒洋洋地由HttpRequest.Form属性初始化,所以一定要确保HttpRequest.Form已被浏览过至少一次提前。

+0

很高兴知道,谢谢。 – Austin 2012-02-02 15:12:34

+0

直到最近还不知道HttpRequest.Unvalidated.Form。谢谢。 – 2012-11-10 19:19:49

相关问题