我一直在努力解决一个奇怪的问题。我有一组正则表达式模式,可用来匹配和阻止针对我的网站的黑客入侵尝试。
有一种非常常见的特定模式,但是由于某种原因,我针对的模式并不总是与传入的网址匹配。
如果我手动浏览代码,或者尝试自己访问记录的URL,或者使用REGEX STORM测试URL,那么我的模式将始终捕获该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 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匹配以“ $”结尾的正则表达式模式。 / p>
这个理论甚至有意义吗,有人有更好的主意吗? IsMatch函数中是否可能存在错误?
答案 0 :(得分:3)
文档Regular Expression Options说:
默认情况下,将输入字符串与正则表达式模式中的所有文字字符进行比较都是区分大小写的[...]
Content-Length
中的“ D”可能是个问题。 (示例字符串和模式在帖子的原始版本中大小写不同)
此外,请使用逐字字符串(3D
)以避免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
另请参阅:Strings (C# Programming Guide) / Regular and Verbatim String Literals