这是.net Regex的一个bug还是一个特性?

本文关键字:一个 bug Regex 这是 net | 更新日期: 2023-09-27 18:12:04

我正在学习c#正则表达式,我正在尝试这个:

String pattern = @"'(([0-9]+ *, *)*[0-9]+')";
Regex reg = new Regex(pattern);
if (!reg.IsMatch(TestGroupIDs))
    throw new Exception("Invalid TestGroupIDs string in App.config. The proper format is: (4,6)");

假定验证如下字符串:"(3)", "(3,4,5)", "(3 ,4)", "(3 , 4)"

,我测试了它对这个字符串:"(4,6) OR 1=1"和正则表达式匹配。在尝试了其他一些类似的情况后,我发现。net Regex将" OR 1=1"部分视为布尔表达式。这是。net中的一个bug吗?有解决方法吗?


考虑到人们不相信我,我将展示一些我尝试过的案例:

"(4,6) || 1 = 1" => A first chance exception of type 'System.NullReferenceException' occurred in DesktopMonitor.exe Incorrect syntax near '|'.

"(4,6) OR 1" => An expression of non-boolean type specified in a context where a condition is expected, near '1'.

我相信这些结果应该验证我的观点。


感谢@false和@Rawling的指正。请看下面@false的回答。外卖:

  1. 在进入结论之前使用调试器;
  2. 相信微软,即使他们做的手机和浏览器很烂。(jk, WP和IE现在已经很不错了)

这是.net Regex的一个bug还是一个特性?

我发现c# Regex将"OR 1=1"部分视为布尔表达式

不,它完全忽略了它。您正在检查正则表达式是否匹配字符串:

(4,6) OR 1=1

好吧,它有!在这里:

(4,6) OR 1=1
-----

如果要验证字符串,通常需要将正则表达式锚定在字符串的开头和结尾——分别使用^$——因此它只能匹配整个字符串。

String pattern = @"^'(([0-9]+ *, *)*[0-9]+')$";

我想你忘记了结束和开始字符。应该是:

"^'(([0-9]+ *, *)*[0-9]+')$"

查看这里的regex帮助:http://www.proftpd.org/docs/howto/Regex.html