Regex IsMatch случайно не соответствует шаблону - PullRequest
2 голосов
/ 02 июля 2019

Я боролся со странной проблемой. У меня есть набор шаблонов регулярных выражений, которые я использую для сопоставления и блокирования попыток взлома моего сайта.

Есть один конкретный шаблон, который довольно распространен, однако по какой-то причине шаблон, на который я нацеливаюсь, не всегда соответствует входящему URL.

Если я вручную пройдусь по коду или попытаюсь получить доступ к записанному URL-адресу самостоятельно, или использую REGEX STORM для проверки URL-адреса, тогда мой шаблон всегда его ловит.

Вот шаблон регулярного выражения, который я создал.

(%20|\+)and(%20|\+)(%27|%22)\w(%27|%22)%3d(%27|%22)\w$

Вот выбор конца входящих URL на мой сайт, я вручную вставил пробелы, чтобы все части, которые соответствуют регулярному выражению, были выстроены в ряд.

SUCCEED (matched the regex)

=&txt_8=%22                    %20and%20%22x%22%3d%22y
xt_1117=&LookupKey=SBR_RAB%27  %20and%20%27x%27%3d%27y
xt_1117=&LookupKey=SBR_RAB%22  %20and%20%22x%22%3d%22y
SSBBRREF%27                    %20and%20%27x%27%3d%27y
SSBBRREF%22                    %20and%20%22x%22%3d%22y
e=SBRRAB%27                    %20and%20%27x%27%3d%27y
=&txt_8=%27                    %20and%20%27x%27%3d%27y
xt_1117=&LookupKey=SBR_RAB%27  %20and%20%27x%27%3d%27x
SSBBRREF%27                    %20and%20%27x%27%3d%27x
e=SBRRAB%27                    %20and%20%27x%27%3d%27x
=&txt_8=%27                    %20and%20%27x%27%3d%27x

FAILED (did not match the regex)

xt_1117=&LookupKey=SBR_RAB%22  %20and%20%22x%22%3d%22x
SSBBRREF%22                    %20and%20%22x%22%3d%22x
e=SBRRAB%22                    %20and%20%22x%22%3d%22x

Вот код, который его запускает

var reg = new System.Text.RegularExpressions.Regex(
    @"(%20|\+)and(%20|\+)(%27|%22)\w(%27|%22)%3d(%27|%22)\w$");
if (reg.IsMatch(url))
  BlockAttempt();

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

Пока что моя единственная теория заключается в том, что каким-то образом в конце URL-адреса есть невидимый символ, который не попадает в мой журнал, но при этом не позволяет URL-адресу сопоставить шаблон регулярного выражения, заканчивающийся на '$'.

Имеет ли эта теория смысл, есть ли у кого-нибудь идеи получше? Есть ли ошибка в функции IsMatch?

1 Ответ

3 голосов
/ 02 июля 2019

В документации Параметры регулярных выражений говорится:

По умолчанию сравнение входной строки с любыми литеральными символами в шаблоне регулярного выражения чувствительно к регистру [...]

«D» в 3D может быть проблемой. (пример строки и шаблон имели другой регистр в исходной версии поста)

Кроме того, используйте дословные строки (@"..."), чтобы избежать использования C # обратного слеша как символа экранирования строки (строка не была дословной в оригинальной версии поста) .В противном случае вам придется удвоить обратную косую черту:

"(%20|\\+)and(%20|\\+)(%27|%22)\\w(%27|%22)%3d(%27|%22)\\w$"

С дословной строкой и параметрами

var reg = new System.Text.RegularExpressions.Regex(
    @"(%20|\+)and(%20|\+)(%27|%22)\w(%27|%22)%3d(%27|%22)\w$",
    RegexOptions.Compiled | RegexOptions.IgnoreCase);

Если вы используете это регулярное выражение несколько раз, опция RegexOptions.Compiled ускоряет ваши тесты.

Если вы считаете, что в конце может быть символ пробела, используйте

(%20|\+)and(%20|\+)(%27|%22)\w(%27|%22)%3d(%27|%22)\w\s*$

См. Также: Строки (Руководство по программированию в C #) / Строковые литералы Regular и Verbatim

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