Обработка HttpRequestValidationException в ASP.NET - PullRequest
2 голосов
/ 18 декабря 2009

У меня проблема с тем, что некоторые пользователи приходят на мой сайт с файлами cookie, которые содержат символы <или & (частично вне моего контроля). Они помечены как опасные в ASP.NET. Я хотел бы иметь возможность перехватить исключение, проверить некоторые известные случаи, которые я хочу разрешить, а затем снова выдать исключение. Я не хочу попадать в глобальную ошибку Application_Error, потому что я хочу, чтобы запрос продолжался, как будто ничего не произошло в выбранных «известных случаях». </p>

Я подумал, что смогу сделать это, прочитав мои Request.Cookies в Application_BeginRequest и затем поймав исключение. Оказывается, однако, что это слишком рано. В это время куки могут быть прочитаны без проблем. Инспекция (рефлектор) узнает, что исключения проверки генерируются только после вызова метода HttpRequest.ValidateInput (). Это делает проверку «острой», но мне не ясно, когда это произойдет. Итак, когда / где запустить проверку, чтобы предотвратить ее последующее всплытие? Или, может быть, совершенно другой подход?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

В качестве варианта ответа Teun D другой альтернативой будет проверка всех файлов cookie, имена которых начинаются с "__utm" (как это делают файлы cookie Google Analytics), и таким же образом очищают их содержимое.

Это решение может быть несколько более надежным, поскольку файлы cookie __utm ... могут содержать все виды мусора из внешних ссылок и ссылок поисковых систем; в значениях, которые вызывают ошибку RequestValidation, могут быть символы, отличные от «<». </p>

Извиняюсь за VB, но я уверен, что вы, ребята, можете достаточно легко перевести в правильный код:)

Private regGACookie As New Regex("^__utm")
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    For Each strName As String In Request.Cookies
        If regGACookie.IsMatch(strName) Then
            ' Leave the cookie alone, but remove from the request'
            Request.Cookies(strName).Value = ""
        End If
    Next
End Sub
1 голос
/ 21 декабря 2009

Мне оказывается довольно сложно справиться с этим исключением. Я не нашел реального ответа на свой вопрос, но я нашел обходной путь, который может работать и для других, поэтому я задокументирую его здесь. Подозрительные значения в моих файлах cookie на самом деле записаны Google Analytics, поэтому я не могу запретить запись значений с <в них. Однако мне все равно не нужны эти файлы cookie на сервере. Google Analytics читает их содержимое на клиенте. Поэтому я проверил содержимое самого cookie-файла и очистил подозрительное содержимое <strong>на время запроса , установив значение «». Файлы cookie остаются без изменений, но содержимое коллекции Request.Cookies исчезло.

Достаточно хорошо для меня.

private static Regex _hasHtmlTag = new Regex("<\\w"); // matches an < with a letter or number after it
protected void Application_BeginRequest(object sender, EventArgs e)
{
    foreach (string name in Request.Cookies)
    {
        string cookieValue = Request.Cookies[name].Value;
        if (_hasHtmlTag.IsMatch(cookieValue))
        {
            // Leave the cookie alone, but remove from the request
            Request.Cookies[name].Value = "";
        }
    }
}
0 голосов
/ 18 декабря 2009

Вы можете отключить этот вид проверки, отключив проверку запросов на web.config

<configuration>  
    <system.web>  
       <pages validateRequest="false" />  
    </system.web>
</configuration>
...