Как получить значение формы, которая вызвала «потенциально опасное значение Request.Form было обнаружено от клиента» в MVC? - PullRequest
5 голосов
/ 02 февраля 2012

У меня есть приложение 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 Ответ

12 голосов
/ 02 февраля 2012

В 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 был получен доступ хотя бы один раз.

...