Где найти или продублировать код, который создает исключение HttpRequestValidationException - PullRequest
3 голосов
/ 30 января 2009

У меня есть некоторые PageMethods (статические методы на странице, помеченные <WebMethod>), определенные на некоторых страницах, и вызываю их с помощью вызова ajax. Этот POST для сервера, по-видимому, не вызывает код ASP.NET, который вызовет HttpRequestValidationException, если отправленные данные будут сочтены возможными XSS, поэтому я хотел бы продублировать этот проверочный код, чтобы запустить его в методах моей страницы.

Кто-нибудь знает детали этого кода или где я могу его найти? Я заглянул в библиотеку MS AntiXss, но она выполняет только кодирование, не проверяя ввод, AFAIK.

Редактировать: Или укажите мне код или библиотеку, которая выполняет аналогичную проверку.

1 Ответ

3 голосов
/ 24 марта 2011

Анализируя трассировку стека при возникновении исключения System.Web.HttpRequestValidationException, мы можем выяснить, какой код его генерирует.

System.Web.HttpRequestValidationException (0x80004005): потенциально опасное значение Request.Form было обнаружено от клиента (IdentifierTextBox = "

в System.Web.HttpRequest.ValidateString (строковое значение, String collectionKey, RequestValidationSource requestCollection)

Используя Reflector, мы обнаруживаем, что ValidateString вызывает: RequestValidator.Current.IsValidRequestString, который, в свою очередь, вызывает CrossSiteScriptingValidation.IsDangerousString, что:

internal static bool IsDangerousString(string s, out int matchIndex)
{
matchIndex = 0;
int startIndex = 0;
while (true)
{
    int num2 = s.IndexOfAny(startingChars, startIndex);
    if (num2 < 0)
    {
        return false;
    }
    if (num2 == (s.Length - 1))
    {
        return false;
    }
    matchIndex = num2;
    char ch = s[num2];
    if (ch != '&')
    {
        if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?'))))
        {
            return true;
        }
    }
    else if (s[num2 + 1] == '#')
    {
        return true;
    }
    startIndex = num2 + 1;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...