C# Regex IsMatch随机无法匹配模式
我一直在努力解决一个奇怪的问题。我有一套正则表达式模式,用于匹配和阻止针对我的网站的黑客企图 有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的url匹配 如果我手动单步执行代码,或者自己尝试访问记录的URL,或者使用测试URL,那么我的模式总是捕获它 这是我创建的正则表达式模式C# Regex IsMatch随机无法匹配模式,c#,regex,C#,Regex,我一直在努力解决一个奇怪的问题。我有一套正则表达式模式,用于匹配和阻止针对我的网站的黑客企图 有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的url匹配 如果我手动单步执行代码,或者自己尝试访问记录的URL,或者使用测试URL,那么我的模式总是捕获它 这是我创建的正则表达式模式 (%20\+)和(%20\+)(%27\%22)\w(%27\%22)%3d(%27\%22)\w$ 这里是我的站点的传入URL的结尾部分,我已经手动插入了空格,所以匹配正则表达式的部分都是对
(%20\+)和(%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 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匹配以“$”结尾的正则表达式模式
这个理论有意义吗?有人有更好的想法吗?IsMatch函数中是否可能存在错误?文档中说:
默认情况下,输入字符串与正则表达式模式中的任何文字字符的比较区分大小写[…]
3D
中的“D”可能是个问题。(示例字符串和模式在文章的原始版本中大小写不同)
此外,使用逐字字符串(@“…”
)避免将反斜杠视为字符串转义字符(原始版本中的字符串不是逐字)。否则,必须将反斜杠加倍:
"(%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*$
另请参见:在URL发送到正则表达式之前,我对其执行ToLower()。我在帖子中更新了URL数据以反映这一事实。正则表达式存储在数据库中,为了清晰起见,它被显式地插入到post中,因此我认为逐字字符串不应该是一个问题。使用编译功能并缓存正则表达式对于提高速度是一个好主意,但我不认为这是这个问题的原因。@Olivier Jacot Descombes:使用RegexOptions.Compiled和RegexOptions.IgnoreCase是个坏主意,因为这种组合比解释的慢50%。我已经在这里为.NETCore解决了这个问题:不确定这是否会进入.NET4.8。@AloisKraus:这是一个非常意外的行为。很高兴知道。@JeremeGuenther:这就是为什么你应该在SO上发布真正的代码。你在哪个区域工作?string.ToLower的行为因区域设置而异。查看土耳其I问题的检查位置。考虑添加ReXopop.Studio不变。你可以尝试用一些中文字符调用你的网站。可能是您的查看器显示的字符的字体没有glyph emtpy空格或什么都没有。试着对日志文件使用十六进制编辑器来确定一下。这些似乎是一些非常好的主意。我的数据库字段是varchar而不是nvarchar,我在en-US工作,但是调用(成功和失败)来自荷兰IP的空白语言字符串。我实现了CultureInvariant建议(并更新了帖子以反映它),但这仍然是一个问题。