2010-06-16 128 views
1

我想限制允許上傳的文件類型爲圖片,pdf和文檔。推薦的方法是什麼?限制允許上傳的文件類型asp.net

我假設僅僅檢查文件擴展名是不夠的,因爲攻擊者可以根據自己的意願更改文件擴展名。

我也想過使用PostedFile.ContentType檢查MIME類型。

我還不知道這是否增加了單獨檢查文件擴展名以及攻擊者是否有能力輕鬆更改這些信息的功能。

這基本上是一個課程管理系統,供學生上傳作業和教師下載和查看它們。

謝謝。

+0

'PostedFile.ContentType'的值由攻擊者控制。不要檢查這個變量,這是浪費。 – rook 2010-06-16 18:45:49

回答

1

我同意驗證pranay_stacker顯示的擴展名,並檢查PostedFile.ContentType將提供另一層安全性。但是,它仍然依賴於客戶端設置的Content-Type標頭,因此容易受到攻擊。

如果你想保證文件類型,那麼你需要上傳文件並檢查前2個字節。沿(未經測試)東西線

string fileclass = ""; 
using(System.IO.BinaryReader r = new System.IO.BinaryReader(fileUpload1.PostedFile.InputStream)) 
{ 
    byte buffer = r.ReadByte(); 
    fileclass = buffer.ToString(); 
    buffer = r.ReadByte(); 
    fileclass += buffer.ToString(); 
    r.Close(); 
} 
if(fileclass!="3780")//.pdf 208207=.doc 7173=.gif 255216=.jpg 6677=.bmp 13780=.png 
{ 
    errorLiteral.Text = "<p>Error - The upload file must be in PDF format.</p>" 
    return; 
} 

這是非常粗糙,不健壯,希望有人可以擴大這一點。

+0

謝謝!這足以讓我開始! el.pescado的博客文章讓我想知道這個解決方案是否跨平臺兼容,即不同的操作系統是否爲相同的格式生成不同的文件頭。你的想法? 另外 - 這種方法的成本效益是什麼(好處很明顯)?請記住,這是一個課程管理系統,學生可以上傳文件,教師可以下載文件(反之亦然)。 也許這整個方法是矯枉過正? – Eran 2010-06-16 14:35:11

+0

如果這不是一個公開可用的系統,那麼我認爲你是對的,這種方法是矯枉過正的。如果你能相信學生沒有意圖故意上傳惡意文件,那麼擴展和內容類型驗證就足夠了。 – Luke 2010-06-16 15:18:29

0

要確定99%,您必須檢查上傳文件的magic numbers,就像UNIX file實用程序一樣。

+0

謝謝!這與盧克在上面的帖子中提供的方向類似。讀取前兩個字節足以獲得我需要的神奇數字的信息?這是獨立於平臺的解決方案嗎? – Eran 2010-06-16 14:37:13

+0

這取決於文件類型。有關示例,請參閱鏈接的Wikipedia文章。 – 2010-06-16 14:50:04

相關問題