2013-04-01 96 views
0

我需要同樣的事情,因爲這傢伙在這裏:如何防止直接訪問ASP.NET MVC中的圖像?

http://forums.asp.net/t/1507682.aspx

的事情是,他的答案標記爲正確的,我不工作。我很快就會使用ASP.NET MVC3來遷移到MVC4和Windows Server 2012. 由於安全問題,我想防止直接訪問某些圖像。這不是我現在擔心的Image Leeching保護,我讀了幾篇關於如何做的文章。

如果鏈接是我的網頁這樣

<img src="/Content/Images/img1.jpg" /> 

上的圖像應該被顯示,但如果它是直接訪問:

http://mywebsite.com/Content/Images/img1.jpg 

因爲我們正在談論的圖像和幾個人們訪問它,考慮性能問題的解決方案將是我的出路。

有關如何實現該想法的任何想法?

謝謝。

回答

3

你可能想在MVC和handle hotlinking in IIS itself以外進行思考。 IIS具有工具(referer(sic)頭)來確定圖像請求是否來自您的網站或不是。

+0

這是一個非常好的主意,因爲我完全控制了我的服務器。這將使訪問按我描述的方式工作,對吧?謝謝你的回答,我會稍後再試。 – eestein

+0

@eestein它將防止盜鏈(搜索引擎結果或第三方網站直接鏈接到您的圖片)。如果您對文件有真正的安全問題,最好不要放在公共網站上。 – 48klocs

+0

謝謝,但這實際上是一個灰色地帶,目前我沒有選擇。 :d – eestein

3

編寫一個Action方法,它從磁盤/數據庫讀取圖像並進行渲染。在該操作方法中,您可以檢查用戶是否被授權並返回適當的圖像或「未經授權」的圖像。

public class ProductController : Controller 
{ 
    public ActionResult Photo(string id) 
    { 
    // TO DO: get image using the unique id passed and render it 
    } 
} 

您可以使用此操作方法的路徑作爲圖像路徑。

<img src="@Url.Action("Photo","Product")/someUniqueIDOfPhotoFromYourDB" /> 

與直接從磁盤提供映像相比,此方法會產生輕微的性能影響。

+0

這是最好的方法嗎?我真的不想推遲這個過程。感謝您的回答。 – eestein

+1

可能是因爲你聲明你想從哪裏(uri)控制資源被訪問。 – Romoku

+0

@Romoku好的,但我沒有使用數據庫來存儲我的圖像。這也不符合我的計劃。這可以使用本地文件完成嗎?正如我從他的回答中看到的,我需要更改圖像的權限以避免直接訪問,對嗎?謝謝。 – eestein