2016-10-24 74 views
1

我將在.NET Core 1.0.1的新網站上接受用戶上傳。我只想讓圖像,但不只是任何文件。我如何在.NET Core中執行此驗證?沒有System.Drawing,因爲沒有實施,是否可以這樣做?驗證上傳的文件是圖像

This answer看起來很有前途,但它最終使用System.Drawing。是否足以檢查內容類型和擴展名?


編輯:接受的答案是我需要什麼,但我會在這裏分享我的實際執行情況。我在.NET Core中這樣做,但我很確定相同的代碼在完整的框架中工作。

static bool IsJpeg(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt16(); 
     var marker = br.ReadUInt16(); 
     return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff; 
    } 
} 

static bool IsPng(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt64(); 
     return soi == 0x0a1a0a0d474e5089; 
    } 
} 

static bool IsGif(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt32(); 
     var p2 = br.ReadUInt16(); 

     return soi == 0x38464947 && (p2 == 0x6137 || p2 == 0x6139); 
    } 
} 
+0

」檢查內容類型和擴展名是否足夠? - 你想解決或避免什麼問題?我可以將'virus.exe'重命名爲'normalPicture.jpg',並將其上傳到您的網站,檢查擴展名不會停止(我不知道什麼設置內容類型,無論它可能只是看着擴展也不會「讀取」文件來確定它)。 – Quantic

回答

4

僅檢查文件擴展名是不夠的。我可以創建一個ZIP文件,然後將擴展名重命名爲.jpg,並且您會認爲這是一個有效的文件。

圖像格式在開始時確實有「魔術字節」,您可以使用它來潛在地識別文件實際上是圖像。 This Wikipedia entry here has a list of magic numbers you could check against

還要注意內容類型可能被欺騙。

所以你有兩件事你可以做。原始答案中指定的內容類型,並結合檢查文件的「幻數」。如果有人真的想上傳不是圖像的duff數據並繞過這兩項檢查,則可能需要做其他事情。

所以,你必須知道3名後衛可以實現:

  1. 是否有文件上的白名單中的延伸? (.jpg/.jpeg/etc ...)
  2. 內容類型是否與白名單上的條目匹配? (image/jpeg)
  3. 一旦你確定了哪一種文件是通過前2個步驟,幻數是否也匹配? 「
+0

這很完美。謝謝! – vaindil

+0

@vaindil您是否可以將其應用於ASP.NET Core,因爲沒有繪圖類?你能分享你的成就嗎?謝謝 – Techy

+0

@ZainAlabdinTawfiq我只是將我的實現添加到問題本身。 – vaindil