我正在尝试为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),但几乎所有那些本来应该断言的都没有。
将正则表达式修改为"([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#正则表达式中的分号有什么特别之处吗?
答案 0 :(得分:3)
您的正则表达式不包含start(^
)和end($
)个字符,因此在您的输入字符串中匹配。将其更改为以下内容:
Regex validFileName = new Regex(@"^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$");
不使用这些,测试通过,因为它匹配文件名的子字符串。在您给出的示例中,正则表达式匹配以粗体显示:
MyFile的;的 asp.jpg 强>
答案 1 :(得分:0)
您可能应该使用^和$符号来匹配整个输入字符串吗?
^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$