Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Regex IsMatch随机无法匹配模式_C#_Regex - Fatal编程技术网

C# Regex IsMatch随机无法匹配模式

C# Regex IsMatch随机无法匹配模式,c#,regex,C#,Regex,我一直在努力解决一个奇怪的问题。我有一套正则表达式模式,用于匹配和阻止针对我的网站的黑客企图 有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的url匹配 如果我手动单步执行代码,或者自己尝试访问记录的URL,或者使用测试URL,那么我的模式总是捕获它 这是我创建的正则表达式模式 (%20\+)和(%20\+)(%27\%22)\w(%27\%22)%3d(%27\%22)\w$ 这里是我的站点的传入URL的结尾部分,我已经手动插入了空格,所以匹配正则表达式的部分都是对

我一直在努力解决一个奇怪的问题。我有一套正则表达式模式,用于匹配和阻止针对我的网站的黑客企图

有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的url匹配

如果我手动单步执行代码,或者自己尝试访问记录的URL,或者使用测试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建议(并更新了帖子以反映它),但这仍然是一个问题。