2014-05-17 75 views
1

我需要一個安全的解決方案來存儲較大(未知)數量的私人圖像只能被某個用戶訪問。這個問題並沒有包含像登錄,會話或類似的東西 - 只是圍繞圖像和它們被存儲。安全地存儲私人圖像

我將首先解釋我正在努力實現的目標,然後繼續我一直在想的事情。

私人圖片只能由某個用戶在訪問我的網站上傳和他/她提供的,並上傳瀏覽圖片

用戶登錄。該圖像只能由該用戶訪問 - 因此需要登錄。當請求查看圖像時,將通過驗證用戶權限並從安全目錄中提取實際圖像的PHP腳本處理呈現。

我所知道的,假設和思考。

索引圖像,便於同治的

是被上傳在管理數據庫收錄每一個形象,即

Title: "Me on a scooter" 
User: {0E4A759A-CC31-4B0D-97E1-EEFB28F0BF86} 
Filename: asuohLAFUUHJSFUhaSGFUOAHSGUA 
Extension: .jpg 

當用戶想要觀看圖像時,服務器驗證和檢查用戶是否確實是圖像的所有者。

從圖像

讓公衆遠離我讀過一些文章解釋說,這是很好的做法,以保持文檔根目錄以外的文件。雖然我理解這個概念,但我並不完全明白如何在實踐中做到這一點。我的假設:

/var/www/myFolder/ //here's where the html files are stored 
/mySecureFolder/ //here's where the content are stored outside of the root, or on a higher level 

所以每當服務器應該顯示的圖像看起來它在/ mySecureFolder /並檢查文件,使其用戶之前就存在。

假設#2

創建和放置一個.htaccess文件阻止所有人,但本地主機中/ mySecureFolder /是我應該做的,讓別人什麼。

問題#1 PHP的進程正在運行作爲用戶WWW的數據,它是安全做出/ mySecureFolder/WWW的數據的所有者組?

假設#3 - 文件模式

爲了讓沒有,但一個特定的系統用戶,我應該有0770 recursivly文件模式的文件夾,只允許所有者用戶和所有者組的讀,寫和執行權限。

問題2

是使用的.htaccess以拒絕將安全文件夾的根目錄(/無功/網絡/ MyFolder文件/)文件夾外的任何人訪問,但本地主機相同呢?

假設#4過度破壞

加密存儲在文件系統中的每個圖像被矯枉過正和 - 如果目錄權限設置正確 - 不必要的。

我的攻擊場景只有外部攻擊,黑客無法通過SSH訪問服務器,也無法通過服務器實際訪問。因此,可能的攻擊是來自我創建的代碼的外部攻擊 - 例如注入等。

我希望可能的答案可能會適用於未來的旁路,因此,如果你能幫助我排除這個問題的格式,以確保它儘可能清楚,我將不勝感激。

回答

3

最好的方法是將圖像存儲在/ www之外 - 並將它們放在自己的目錄中。

然後使用readfile()將圖像「提供」給授權用戶。無需CHMOD或使用htaccess等 - 因爲它位於www文件夾之外,除了通過您的應用程序之外無法訪問。

像這樣的東西會工作:

function show_image($file_name= "") 
{ 
    // Ensure no funny business names to prevent directory transversal etc. 
    $file_name = str_replace ('..', '', $file_name); 
    $file_name = str_replace ('/', '', $file_name); 

    // now do the logic to check user is logged in - put your own code here 
    if (LoggedInUserCanAccessThisFile()) 
    { 
     // Serve file via readfile() 
     // Images are stored in a specific user folder - so only the own user can get their own images 
     readfile('../image_storage/' . getLoggedInUserID() . '/' . $file_name); 
    } 
} 

你可以閱讀更多關於readfile() here from php.net

+0

因此,將目錄的所有者設置在/ www www-data之外是安全的嗎? – Alex

+0

是的 - 因爲沒有人可以通過您的應用程序「獲取」該文件夾。另外 - 你沒有真正的選擇 - 你不能將文件夾「CHMOD」給你的應用程序的用戶 - 因爲該用戶不是你的操作系統的一部分 - 他們是你的應用程序的用戶。您的操作系統的用戶是www-data – Laurence

+0

@Alex需要一個相關的CHMOD和所有者,以便Web服務器進程,並且PHP有權讀取這些文件。 – MrCode

1

我就類似問題的工作;不過,我可能會改變我的邏輯來結合readfile()函數。但現在,我在公共html文件夾外的安全文件夾中有圖像。 php腳本將目錄讀入會話數組,然後按文件名對其進行分類。第二個腳本使用html來導航文件名數組。當選擇一個文件時,它被複制到一個tmp公共圖像目錄並通過html顯示。在選擇下一個文件之前,前一個文件將從tmp目錄中刪除。原始文件保留在安全文件夾中。這可能有些尷尬,但它對我來說很好。