簡體   English   中英

正則表達式IsMatch隨機不匹配模式

[英]Regex IsMatch randomly failing to match pattern

我一直在努力解決一個奇怪的問題。 我有一組正則表達式模式,用於匹配和阻止針對我的網站的黑客攻擊嘗試。

有一種非常普遍的特定模式,但是由於某種原因,我針對的模式並不總是與傳入的URL匹配。

如果我手動瀏覽代碼,或者嘗試自己訪問記錄的URL,或者使用REGEX STORM來測試URL,那么我的模式總是會捕獲它。

這是我創建的正則表達式模式。

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

這是我網站的傳入URL末尾的選擇,我手動插入了空格,以便將與regex匹配的部分全部對齊。

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 url = Request.RawUrl.ToLower(System.Globalization.CultureInfo.InvariantCulture);

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

考慮到如果我嘗試訪問與記錄在日志中的URL相同的URL,並且在執行此操作時它被正則表達式正確地阻止,則我不明白為什么這些URL有時會誤粘貼安全代碼的特定部分。

到目前為止,我唯一的理論是,URL的末尾不知何故會有一個不可見的字符,該字符不會進入我的日志,但仍阻止URL匹配以“ $”結尾的正則表達式模式。

這個理論甚至有意義嗎,有人有更好的主意嗎? IsMatch函數中是否可能存在錯誤?

文檔正則表達式選項說:

默認情況下,將輸入字符串與正則表達式模式中的所有文字字符進行比較都是區分大小寫的。

3D的“ D”可能是個問題。 (示例字符串和模式在帖子的原始版本中具有不同的大小寫)

另外,請使用逐字字符串( @"..." )以避免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#編程指南)/常規和逐字字符串文字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM