2012-08-05 27 views
1

[這是關於先前在此處與計算機語言學家討論的後續/清理問題,希望我指定了這個足夠的空間] ImageResizer可以抓取站點根外部的文件併爲它們服務(因此,在線提供未經更改的原件)? 或者這種情況下的最佳做法是什麼?使用ImageResizer結合使用圖像的安全服務

*如果原始文件存儲在網站根目錄之外,基本大小的圖像會在線存儲(通過url auth/httpmodule等進行保護),然後讓Imageresizer根據該圖像進行大小調整等操作。就我所見,我還沒有找到一種方法來限制訪問100%到一個文件夾,除了通過imageresizer請求時。如果ImageResizer可以調整大小,用戶可以訪問它似乎sofar。

*或者可能是一個控制器服務原始圖像,然後由ImageResizer處理的解決方案。

的主要目的是:

  1. 可以自定義權限規則完全

  2. 能夠以安全的方式來服務(ATLEAST到目前爲止,我已經學會不改變用戶上傳的圖片應該不能在siteroot下直接訪問)。保存原件似乎是一種面向未來的策略。

  3. 能夠利用ImageResizer實時調整大小。

任何有關其他人如何實施此功能的任何輸入也將受到讚賞。

回答

1
  1. 查找站點根外部的文件並沒有完成任何操作。您仍然必須將它們裝載爲虛擬文件夾,以便再次訪問它們。
  2. MVC是這樣編寫的,它在這裏絕對沒用 - 它拖延直到ProcessRequest做任何事情。
  3. ImageResizer對於這個問題是無關緊要的 - 它表現得像StaticFileHandler爲你的目的 - 你需要一個通用的授權系統。
  4. ASP.NET URL Authorization聽起來像它可能不夠複雜,以滿足您所需的複雜程度。

要完成自定義授權邏輯,您需要處理HTTP管道中的AuthorizeRequest事件並從頭開始實現您的路徑分析邏輯。您可以在Global.asax.cs中處理該事件或通過實施IHttpModule。

在AuthorizeRequest中,您可以在ImageResizer或任何其他HttpModule或HttpHandler看到它之前訪問傳入路徑和查詢字符串數據,決定用戶是否應該能夠今天訪問它,並讓請求繼續或拋出一個HTTP 401錯誤。

我建議使用ILSpy來查看System.Web.Security中的UrlAuthorizationModule。這只是幾頁代碼的長度,而且非常簡單。

+0

我之前看了一下AuthorizeRequest,並構建了一個乾淨的httpmodule來設置我的權限結構。我真的不能包裹我的頭是如何最好地處理源圖像看到xss和其他的東西。 但是我傾向於強制重新編碼所有上傳而不改變高度/寬度等等(我認爲我看到你在你的一些文檔中提到它),並使用它作爲完整的基本圖像。無論如何,通過擴展,大小,上傳格式檢查,這可能會提供一個體面的安全水平。不確定將這些文件放在virtul文件夾中是否會帶來好處。 – Baserz 2012-08-06 07:16:52

+0

關於我之前想過的事情,儘管你之前曾經提到過有關磁盤緩存的簡要介紹。 imagecache似乎有一個web.config規則阻止訪問它。這應該意味着只要我保護原件,ImageResizer將不會提供緩存的版本,對嗎?或者我還必須在ImageResizer事件上實現授權嗎? – Baserz 2012-08-06 07:20:34

+0

只要你保護原件,ImageResizer將保護變化。切勿使用隨上傳提供的文件名或擴展名。使用GUID和您檢測到的格式擴展名。這將防止服務器和客戶端嘗試解釋上傳的數據,除非作爲靜態圖像。如果你真的偏執,只需在上傳過程中重新編碼原件。 – 2012-08-06 14:12:13