2013-05-21 73 views
1

我試圖從HTTP處理程序檢索圖像。混淆HTTP處理程序旨在返回圖像

我遇到的一個問題是爲了讓應用程序只能訪問圖像,我試過編輯匿名IIS身份驗證來允許應用程序池標識,但這仍然允許用戶通過。

下面是一個例子:

  1. ASPX頁面使得所述處理程序的調用(picService.ashx ID = 1?)通過查詢字符串傳遞一個ID
  2. HTTP處理髮送回圖像
  3. 的圖像來源是服務/ picService.ashx?id = 1

這一切工作正常。現在,如果用戶想要訪問picService.ashx並輸入任何舊ID,它將返回與該ID相關的圖像。我正在處理敏感信息,所以這是不可接受的。

我已經看過HTTP Forbidden處理程序,但我不確定我是否要走正確的路線。

我也試過在ASPX頁面中返回圖片,但由於圖片控件需要一個URL,所以你不能這樣做。

如何從數據庫中返回圖像並確保圖像的來源安全?

我應該以不同的方式做到這一點嗎?還是我在正確的軌道上(http禁止)?

+0

定義「安全」 – StingyJack

+0

客戶端應該無法直接訪問服務並檢索圖像。這個問題是關於實現這一目標的多種方式。 – Robbie

+0

爲什麼你需要解決混淆而不是強制執行適當的安全措施? – bmm6o

回答

5

我過去曾經使用過的一種技術是讓頁面(步驟1)創建一個GUID,並在對象中註冊一個由具有實際圖像URL的GUID爲鍵值的緩存項。該頁面使用GUID構造處理程序的url並傳遞給處理程序

處理程序(步驟2)然後知道要去緩存以獲取實際值並返回內容。

這樣你只能暴露臨時的「魔術」值。它絕對模糊不清,並且不能替代適當的安全性。

爲例(從內存中,語法可能會關閉一個位)

在ASPX或來電者

string keyValue = Guid.NewGuid().ToString(); 
    int yourImageID = 5; 

    Cache.Add(keyValue, yourImageID) //expire in 5 or 10 seconds 
    string url = "Handler.ashx?imgID=" + HttpUtility.UrlEncode(keyValue); 
    Response.Redirect(url, false); 

在你的處理器(我用的ashx居多,選擇任何適合你的需要)

string key = HttpUtility.UrlDecode(context.Request.QueryString.Get("imgID")); 

int yourImageID = (int) context.Cache.Get(key); 

//get your image from the db and return the content 

再一次,僅僅因爲我使用了guid並不意味着你必須這樣做,但是如果你試圖混淆IDentity,那麼選擇一些與IDentity不相關的東西。

+0

任何機會,你可以舉一個這樣的例子? (我不知道我害怕) 我正在考慮使用單向散列ID(Ids是按順序生成8位數值),將它存儲在一個表中,然後查找真正的值,但是這樣會因爲所有的用戶都知道他們的ID是什麼以及顯而易見的數據庫開銷,所以如果客戶知道被查詢的是什麼,那麼它就不安全。 – Robbie

+0

這工作正常。感謝所有的幫助,標記爲答案,雖然胸腺嘧啶建議同樣的事情,但你是第一個體面的例子。 – Robbie

0

首先,您必須知道您認爲可以如何顯示照片。什麼是您的驗證參數。就像用戶在被認證時允許看到圖片一樣,在允許它看到之前檢查相同的,ashx頁面。因爲在src內部調用src或者在瀏覽器中調用它們對服務器沒有任何影響。因此,您需要檢查一些驗證,以防萬一用戶根本不應直接或直接看到任何方式

+0

我明白了你的觀點,但在這種情況下使用經過身份驗證的信息不會起到幫助作用(除非應用程序受到重大性能影響),每個用戶都可以看到相同的照片或不同的照片,具體取決於他們做什麼,相同的角色,所以沒有辦法將一組照片分配給一個人。 當性能受到影響時,需要進行數據庫查找以查看該用戶是否可以看到該人員的照片。 感謝您的想法。 – Robbie

+1

@Robbie,看到降低性能命中,可以使用緩存來存儲用戶認證。 – Devesh

0

將URL和參數存儲在會話狀態中,並在HttpHandler中訪問會話。要做到這一點,你需要implemement的IRequiresSessionState在你的處理器:

Problem with HttpHandler and session state

Getting Session State in HttpHandlers (ASHX files)

+0

由於性能影響,通常不推薦使用會話。 – StingyJack

+0

性能只會是真正大型圖像的問題。 – IrishChieftain

+0

不,性能會隨着會話中存儲的每個用戶的用戶和對象數量的增加而下降。它與圖像存儲無關。 – StingyJack

2

這就是你的字你的問題有沒有辦法得到它100%的安全。那麼你願意允許什麼樣的折衷?你不是什麼?

你究竟想要防止什麼?只有一個用戶看不到其他用戶的圖像?或者防止right-click, save image as

想到的一個想法是將用戶的IP地址與圖像的ID結合起來,將其散列在緩存中(或使用guid作爲查找這些值的鍵)。一旦使用了散列,可能會將其從緩存中刪除,因此只允許加載圖像一次一個 ip 每頁它應該是on。

您應該能夠將生成的ID與真實之間的映射放入會話中,或者數據庫可能不是最佳答案,它們只是少量數據,您可以將到期時間設置爲較小的值,所以除非你一次有數百萬用戶...

使用Flash控件加載圖像將是安全的無法右鍵點擊保存圖像作爲。如果你擔心有人截取圖像流,也許可以加密流,或者分割圖像頭或其他東西。他們仍然可以獲取圖片的網址,但是您的Flash控件可能會使用特殊的標題,這對普通用戶來說很難理解。

+0

感謝您提出的所有想法和挑戰。每個用戶需要每頁看到多個圖像,這些圖像可以刷新並一次又一次地顯示。 編輯::意外按下輸入。 會議期滿的好處。有很多不同的事情需要考慮。 我對用戶下載圖像沒有任何問題,因爲他們應該能夠首先訪問它們。我擔心的是任何人都可以用ID來查詢處理程序,然後檢索圖像。 – Robbie

+1

從那我想我會說只是生成一個隨機數或GUID,並有一段時間的地圖到一個Id。只有ID的單向散列不會真正起作用,您需要的東西不是基於實際ID,因此無法按邏輯生成。您可以更改數據庫以使用GUID作爲主鍵嗎?這將解決你的許多擔憂,而不需要額外的映射 – Thymine

+0

不幸的是,數據庫是由供應商提供的,這個問題不會被認爲足夠重要以保證這麼大的改變,該ID是最重要的獨特之一身份標識。 我將在明天研究緩存和會話過期以及哪一個會是最好的。 – Robbie