我有一個社交網絡,用戶可以在其中創建嵌入圖像的帖子。圖像存儲在文檔根目錄之外。當請求查看頁面時,我想發送一個具有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重寫來整理一些東西。