Я боролся со странной проблемой. У меня есть набор шаблонов регулярных выражений, которые я использую для сопоставления и блокирования попыток взлома моего сайта.
Есть один конкретный шаблон, который довольно распространен, однако по какой-то причине шаблон, на который я нацеливаюсь, не всегда соответствует входящему 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?