正则表达式 - 分号在不允许字符时通过单元测试

Regular Expressions - Semicolon passing unit test when not allowed character

我正在尝试为 Web 应用程序中的文件上传编写一个文件名验证器。在 OWASP guidance 稍微修改后,我从

开始
public bool IsValidFileName(string filename)
{
    Regex validFileName = new Regex(@"[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}");
    return validFileName.IsMatch(filename);
}

想法是将文件名限制为字母数字、下划线、连字符和空格,并带有一个“.”。和一个文件扩展名。然后我写了一堆测试 (NUnit),但几乎所有应该断言 false 的测试都没有。

将正则表达式修改为 "([a-zA-Z0-9_ -]{1,244}).([a-zA-Z0-9]{1,10})") - 在长度组周围添加了方括号,删除了字符串文字和转义“.”现在通过了除

以外的所有测试
    [Test]
    public void IsValidFileName_NameContainsSemiColon_ReturnsFalse()
    {
        // Arrange
        string filename = "MyFile;asp.jpg";

        // Act
        bool result = FileExtensions.IsValidFileName(filename);

        // Assert
        Assert.That(result, Is.False);
    }

我需要考虑 C# 正则表达式中的分号有什么特别之处吗?

您的正则表达式不包含开始 (^) 和结束 ($) 字符,因此在您的输入字符串中匹配。将其更改为以下内容:

Regex validFileName = new Regex(@"^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$");

不使用这些,测试通过,因为它与您的文件名的子字符串相匹配。在您给出的示例中,您的正则表达式匹配以粗体显示:

MyFile;asp.jpg

您是否应该使用 ^ 和 $ 符号来匹配整个输入字符串?

^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$