正则表达式 - 分号在不允许字符时通过单元测试
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}$
我正在尝试为 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}$