5

我有一个具有自定义 HandleErrorAttribute 的 MVC3 应用程序,以便我可以通过电子邮件发送错误。我经常收到“从客户端检测到潜在危险的 Request.Form 值”,但它只显示导致异常的表单值的前几个字符。我想查看输入的整个表单值,以便更好地了解输入是恶意的还是用户意外的。但是,当我尝试在 HandleErrorAttribute 中提取表单值时,它会引发相同的错误!知道如何从 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
    }
}
4

1 回答 1

14

在 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事先至少访问过一次。

于 2012-02-02T15:11:23.173 回答