2015-04-17 23 views
0

我有一個社交網絡,用戶可以在其中創建嵌入圖像的帖子。圖像存儲在文檔根目錄之外。當請求查看頁面時,我想發送一個具有src屬性的<img>元素的普通HTML響應。問題是,如何有效保護圖像,以便只有授權用戶才能查看它們?在根外存儲圖像時的安全邏輯

網絡背後的權限系統是相當複雜的。社交圖有幾種不同類型的節點和邊,用戶的瀏覽內容的權限取決於此圖。我在每個頁面請求中查詢一次用戶的子圖,以檢索允許的內容列表,但我不想再爲每個圖像再次諮詢它。這是一項昂貴的練習,有些頁面可能有50張或更多圖片。

所以,就我所看到的,我所服務的頁面,我將需要發送鍵(或鍵),當服務器與數據相結合,將「解鎖」的形象。下面是我的意思的例子 - 在這個例子中,我把鑰匙中的URL,其中URL是一個圖像的src屬性:

http://example.com/images?id=1234_my_image_id&key=1234123412341234FFF

在此實現我傳遞一個參數唯一標識圖片。我需要這樣做,因爲我不想進入翻譯表或用戶特定的翻譯表(由於複雜性和性能)。我還發送了一個'圖像密鑰'。

我的想法是,用戶的會議將包括一個「會話密鑰」。當服務器收到圖像的GET時,它會將會話密鑰添加到請求的圖像文件名中,並對它們進行哈希(就像密碼+鹽)。如果散列的結果等於圖像鍵,我將從磁盤檢索圖像併發送它。

這樣做的問題是,如果黑客獲取圖像url,他們有一個輸入到哈希(即圖像鍵)和所需的哈希輸出(即圖像文件名) ,所以他們可以(使用彩虹表)向後工作以獲得潛在會話密鑰的列表。然後,通過一系列請求和一個消除過程,他們可以建立確切的會話密鑰。

那麼,我該如何解決這個問題?我可以用每個請求更改會話密鑰,但這意味着圖像URL會隨着每個請求而改變,所以不會有圖像緩存。

我敢肯定,我不是第一個有這個問題。對這個問題有沒有「共同」的方法? (我找不到這樣的事情)。我可以考慮在頁面響應中使用base64編碼圖像,但我猜測這會導致性能成本。

僅供參考 - 我使用PHP和Apache。我會使用url重寫來整理一些東西。

回答

0

嗯,我在想和你一樣。所以得到圖像ID +用戶密碼,做一個哈希等voilâ。你有一個易於使用的系統。你有

但問題主要是彩虹表。解決這個問題的可能性;

  • bcrypt,做它像一個真的密碼是
  • 使它成爲一個時間敏感的祕密,所以這個祕密只有有效期爲30秒,這可能是爲hash(hash(secret + time) + secret)那樣簡單,雖然現在你必須發送它與它太散列的時間,所以沒有太多的祕密那裏,我想起

    • 保存與圖像列表中的任意多個

    其他解決方案允許ü關於權限更改+上傳更新此列表

  • 您可以創建一個函數displayImage(id),它所做的是呈現<img src="url" />,但在後臺它也會設置一個x秒標誌以允許用戶訪問該圖像。
0

一旦將圖像存儲在根目錄之外,那麼查看它們的唯一方法是讓代碼訪問它們。在PHP中,該代碼看起來像...

$file_location = '../../images/' . $some_id_that_is_authenticated_and_cleansed_for_slashes . '.jpg'; 

readfile($file_location); // grabs file and shows it to user