我正在嘗試爲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#正則表達式分號?
您不使用[開始和結束行錨](https://msdn.microsoft.com/en-us/library/h5181w5w%28v=vs.110%29.aspx) - '「^[a-zA-Z0-9_ - ] {1,244} \。[a-zA-Z0-9] {1,10} $「' – 2015-03-31 11:19:22
添加開始錨點和結束錨點已解決了此測試中的問題,但它有點奇怪,因爲'string filename =「MyFile:asp.jpg」;'通過了等效測試。這個問題實際上應該是讓大腸通過測試的原因嗎? – 2015-03-31 11:27:23