如何获得导致“;从客户端检测到一个潜在危险的Request.Form值“;MVC中

本文关键字:危险 一个 Form MVC Request 何获得 客户端 检测 | 更新日期: 2023-09-27 18:22:10

我有一个MVC3应用程序,它有一个自定义的HandleErrorAttribute,这样我就可以通过电子邮件发送错误。我经常收到"从客户端检测到潜在危险的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
    }
}

如何获得导致“;从客户端检测到一个潜在危险的Request.Form值“;MVC中

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