2015-03-31 42 views
0

我正在嘗試爲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#正則表達式分號?

+0

您不使用[開始和結束行錨](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

+0

添加開始錨點和結束錨點已解決了此測試中的問題,但它有點奇怪,因爲'string filename =「MyFile:asp.jpg」;'通過了等效測試。這個問題實際上應該是讓大腸通過測試的原因嗎? – 2015-03-31 11:27:23

回答

3

您的正則表達式不包含開始(^)和結束($)字符,所以在您的輸入字符串內匹配。將它更改爲以下內容:

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

不使用這些,測試通過,因爲它匹配您的文件名的子字符串。在您給出的示例中,您的正則表達式匹配以粗體顯示:

MyFile; asp.jpg

+0

感謝你 - 任何想法爲什麼冒號通過,根據我對原始問題的評論 – 2015-03-31 11:32:26

+0

分號與您的表達式不匹配 - 如果您查看匹配的值,您會看到它只是文件名後面的位。更新我的答案,使其更清晰。添加開始標記和結束標記強制它只匹配整個輸入字符串。 – Richard 2015-03-31 11:40:07

+0

我明白了,但爲什麼'MyFile:asp.jpg'不匹配? – 2015-03-31 11:45:42

0

可能你應該使用^和$符號來匹配整個輸入字符串嗎?

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