2013-07-29 88 views
2

我想知道是否有人可以提供幫助,我在一週前發送了ImageResizer和電子郵件,至今還沒有收到關於我的查詢的回覆。所以希望ImageResizer或Stackoverflow成員可以回答我的問題。使用ImageResizer.net驗證圖片上傳

我有以下代碼。

if (File != null && File.ContentLength > 0) 
        { 
         string extension = Path.GetExtension(File.FileName.ToLower()); 
         var imageId = Guid.NewGuid(); 
         if (extension == ".png" || extension== ".jpg" || extension == ".jpeg" || extension == ".gif") 
         { 

           var i = new ImageResizer.ImageJob(File, "~/uploads/" + imageId + ".<ext>", 
            new ImageResizer.ResizeSettings("width=200;height=200;format=png;mode=max")) 
           { 
            CreateParentDirectory = false 
           }; 

           i.Build();    
           GetValue(model, imageId); 
           return RedirectToAction("RegisterStepTwo", "Account"); 
          // } 

          // TempData["WrongImageFormat"] = "Image must be either png, jpeg/jpg or gif"; 
          // return View(); 



         } 
         TempData["WrongImageFormat"] = "Image must be either png, jpeg/jpg or gif"; 
         return View(); 
        } 

我有這個網站,其他人在閱讀過去一週是什麼嘗試和驗證對無效的圖片上傳,更改文件名,大小調整和更改擴展名。

上面的代碼似乎這樣做,我添加我自己的Guid添加到數據庫。如果我在記事本中創建一個無效的文件添加JavaScript並將其保存爲PNG,它會返回以下錯誤。

[ImageCorruptedException (0x80004005): File may be corrupted, empty, or may contain a PNG image with a single dimension greater than 65,535 pixels.] 

所以我的問題是,上面的代碼是否防止無效的圖像上傳。閱讀文檔here,並在網站上找不到我需要的信息。

希望有比我更多經驗的人可以幫助解決這個問題。

回答

1

重新編碼圖像並剝離元數據是確保其無法保留任何惡意內容的最佳方法。 ImageResizer默認執行此操作。

但是,確保圖像數據永遠不會被解釋爲圖像以外的任何東西 - 這意味着控制最終文件擴展名,並確保它總是以圖像MIME類型提供給客戶端。使用ImageResizer的模板路徑是一個很好的方法來幫助解決這個問題 - 就像你正在做的那樣。切勿使用上傳的文件名稱。

如果您想將文件擴展名列入白名單,Config.Current.Pipeline.AcceptedImageExtensionsConfig.Current.Pipeline.IsAcceptedImageType(path)將幫助您確定ImageResizer是否可以支持它們作爲源格式。輸出格式總是png,gif,jpeg或webp(如果安裝了WebPEncoder),所以如果使用<ext>路徑變量,則不必擔心。

您可以簡單地使用try{} catch{}塊來捕獲任何拋出的ImageCorruptedException,而不是像過濾上傳文件擴展名。阻止基於文件擴展名的上傳不是非常有用的信息;更好地說,該文件不包含有效的圖像數據。

另外,很抱歉,我們沒有收到上週的電子郵件;在今天之前,我找不到任何關於這個問題的記錄。

+0

您好計算機語言學家,感謝您的回覆,我今晚(今天)發送了另一封電子郵件,附帶我的代碼副本。再次感謝您的幫助,我會根據您的回覆修改代碼。 –