如何在MVC中获取导致“A potentially dangerous Request.Form value was detected from the client”的表单值?

6
我有一个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
    }
}

1
你可以使用 [ValidateInput(false)] 并自行验证。 - M.Babcock
生成错误无妨,我只想知道是哪个输入导致了它。我尝试在我的OnException方法中添加[ValidateInput(false)],但它仍然重新抛出了错误。 - Austin
好的,“ValidateInput”实际上并不能单独“工作”,至少不是它自己。这就是为什么。 真正的问题在于,没有一种安全的方法可以只影响一个操作。这是一个全局设置,会影响整个应用程序。 - Craig Stuntz
1个回答

15

在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


1
最近才知道HttpRequest.Unvalidated.Form。谢谢。 - Matija Grcic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接