gpt4 book ai didi

c# - 正则表达式 IsMatch 随机匹配模式失败

转载 作者:行者123 更新时间:2023-11-30 21:28:05 24 4
gpt4 key购买 nike

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

有一种特定的模式非常常见,但是由于某种原因,我针对它的模式并不总是与传入的 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 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 函数中可能存在错误吗?

最佳答案

文档 Regular Expression Options说:

By default, the comparison of an input string with any literal characters in a regular expression pattern is case sensitive [...]

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*$

另请参阅:Strings (C# Programming Guide) / Regular and Verbatim String Literals

关于c# - 正则表达式 IsMatch 随机匹配模式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56857694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com