ASP.NET потенциально опасный запрос Javascript Regex - PullRequest
5 голосов
/ 05 января 2012

Что такое регулярное выражение , которое Microsoft .NET Framework использует для выполнения стандартной проверки, которая приводит к HttpRequestValidationException «Потенциально опасное значение Request.Form обнаружено клиентом», когда HTML или другой потенциально небезопасный контентопубликовано.

Я бы хотел, чтобы точная копия была преобразована в JavaScript, чтобы пользователь мог получать оповещения раньше.

Мое текущее регулярное выражение (/ (& #) | <[^ <>] +> /) близко, но не совпадает с .NET.

Я знаю, что это может отличаться для разных версий .NET, так что мне бы хотелосьзнать:

  • Регулярное выражение для .NET 2
  • Регулярное выражение для .NET 4

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Вы можете использовать какой-нибудь инструмент для декомпиляции и убедиться, что регулярного выражения вообще нет.Он вызывает статический метод CrossSiteScriptingValidation.IsDangerousString.

Но, возможно, вы можете использовать библиотеку Microsoft AntiXSS для достижения того же.В любом случае вот такой метод:

internal static bool IsDangerousString(string s, out int matchIndex)
{
    matchIndex = 0;
    int num1 = 0;
    int num2 = s.IndexOfAny(CrossSiteScriptingValidation.startingChars, num1);
    if (num2 < 0)
    {
        return false;
    }
    if (num2 == s.Length - 1)
    {
        return false;
    }
    matchIndex = num2;
    char chars = s.get_Chars(num2);
    if ((chars == 38 || chars == 60) && (CrossSiteScriptingValidation.IsAtoZ(s.get_Chars(num2 + 1)) || s.get_Chars(num2 + 1) == 33 || s.get_Chars(num2 + 1) == 47 || s.get_Chars(num2 + 1) == 63))
    {
        return true;
    }
    else
    {
        if (s.get_Chars(num2 + 1) == 35)
        {
            return true;
        }
    }
    num1 = num2 + 1;
}
3 голосов
/ 05 января 2012

Я мог бы ответить на этот вопрос здесь: https://stackoverflow.com/a/4949339/62054

Это регулярное выражение следует логике в .NET 4.

/^(?!(.|\n)*<[a-z!\/?])(?!(.|\n)*&#)(.|\n)*$/i

Найдите исходный код .NET для CrossSiteScriptingValidation, чтобы найти логику, которой придерживается Microsoft. fge прав, он не использует регулярные выражения, вместо этого он использует некоторые циклы и сравнения строк. Я подозреваю, что это для производительности.

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