Автоматически очищать записи в HttpRequestValidationException - PullRequest
3 голосов
/ 05 мая 2009

печально известный A potentially dangerous Request.Form value was detected from the client вопрос:)

Вот мой пример использования: у меня есть FCKEditor элемент управления на веб-странице, который позволяет пользователям вводить HTML. На этой точной веб-странице валидация отключена, чтобы разрешить ее использование, но на моей главной странице есть кнопки ссылок, которые могут вызывать постбэки на других страницах.

Я, очевидно, не хочу бесполезно отключать проверку на каждой странице моего сайта, но я хотел бы иметь возможность очищать входные данные «без вывода сообщений» (либо удаляя ошибочное поле из формы запроса, либо проверяя это).

Я вижу, что на странице можно переопределить OnInit или ProcessRequest, но я бы хотел сделать это на главной странице, если это возможно. (Я даже не уверен, что смогу оправиться от HttpRequestValidationException)

Есть идеи, как мне это сделать?

Редактировать : я играл с Page_Error, которая успешно распознает ошибку, но не могу найти способ возобновить обработку после того, как проверил, что запрос действительно действителен.

Ответы [ 5 ]

5 голосов
/ 08 сентября 2009

Отключите проверку, потому что она проверяется на неправильной стадии процесса.

Проверка входных данных по своей сути ошибочна; вам на самом деле нужна выходная проверка. Это означает, что вы берете любые данные, но перед их печатью кодируете для соответствующего контекста, который будет отображаться. Поэтому для прямой записи на HTML-страницу вы используете HttpUtility.HtmlEncode и другие подобные методы кодирования в зависимости от контекста.

1 голос
/ 08 сентября 2009

Я думаю, вы сможете использовать глобальную обработку исключений, о которой Ричард упоминает, но, возможно, потребуется добавить вызов к ClearError , чтобы избавиться от HttpRequestValidationException и продолжить запрос. Нечто подобное может сработать:

protected void Application_Error(object sender, EventArgs e) {
    Exception ex = Server.GetLastError().GetBaseException();
    if (ex.Message.StartsWith("A potentially dangerous Request.Form value was detected")) {
        Server.ClearError();
    }
}

Возможно, стоит проверить Request.Url и / или Request.UrlReferer, чтобы убедиться, что запрос также исходит от вашей страницы FCKEditor.

Надеюсь, это поможет.

0 голосов
/ 14 сентября 2009

Редактировать: я играл с Page_Error, которая успешно распознает ошибку, но не могу найти способ возобновить обработку после того, как проверил, что запрос действительно действителен:

    protected void Page_Error(object sender, EventArgs e)
    {
        if (Server.GetLastError() is HttpRequestValidationException)
        {
            Server.ClearError();
            //CreateChildControls();
            base.OnPreInit(e); //yeah, ugly as hell
        }
    }

не работает

0 голосов
/ 14 сентября 2009

Должны ли кнопки ссылок быть кнопками (отправлять) или вы можете превратить их в реальные ссылки (получить)? Если вы не передаете данные назад и вам не нужно знать, какая кнопка была нажата, я бы предложил использовать ссылки. Запрос на получение не будет содержать никаких данных формы на странице, поэтому вы не получите сообщение об ошибке на других страницах. Используйте CSS-стили для ссылки, чтобы получить вид кнопки, если она вам нужна.

0 голосов
/ 08 сентября 2009

Если вы хотите обработать исключение определенным образом и проверить запрос во время этого процесса, вы можете рассмотреть глобальную обработку исключений. Здесь есть краткая статья:

http://www.developer.com/net/asp/article.php/961301

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...