2013-11-14 79 views
0

我想以安全的方式存儲用戶上傳的圖像(.jpg)。我很困惑爲了更好的結果和表現而走哪條路。我可以看到最好的選擇是:在網絡服務器上存儲圖像的方式

1. Store the images in database. 
//problem : database size get large. lagging performance 

2. Store them in a folder in encrypted manner. 
//problem : Encryption and decryption on large file slows it down. 

3. Place the image as it is in a folder behind 'public_html' in root directory. 
//problem : I am unsure as they aren't encrypted. 

這將是更好的方法或有任何其他的「最佳實踐」,我不知道有關的權利嗎?

+1

您試圖實現什麼樣的安全性?你害怕什麼攻擊? –

+1

如果會有很多大的圖像文件,並且你沒有一個很好的數據庫後端,那麼絕對不要把它們放在數據庫中(對於某些企業系統,儘管使用數據庫是有意義的)。我認爲加密並不是一種選擇。我個人會選擇選項3.儘管您仍然需要應用程序級別的安全性來確保授權用戶正在檢索允許的圖像,但系統級別的安全性是當時的主要關注點。 –

+0

@MadaraUchiha我很擔心滲漏。因爲他們是私人的。所以安全也是我最關心的問題。 – Rahul

回答

2

它的你想用它做什麼,要確保其不會什麼都的問題。

我沒有看到任何可能的攻擊載體通過圖像。所以我看到兩種可能的選擇,但首先,基本知識:

您將圖像本身存儲在文件系統上。將文件存儲在關係數據庫中效率很低。

  • 您保持文件本身和其重命名爲內容的MD5或SHA1哈希。
  • 數據庫條目鏈接到文件系統上的文件位置以及任何可能需要的元數據(所有者,顏色,類別等)。
  • 文件被分爲基於散列的第一個字母的文件夾(如果你有一個大量的圖像,可以考慮把它分爲目錄基於兩個或三個字母。

現在,根據您的訪問方案,您可以公開地放置這些文件,並簡單地鏈接到它們(因爲文件名很複雜,猜測它會很難),或者您可以將這些文件放在公共根目錄之外,並讓PHP文件訪問它們並提供服務他們在驗證權限後。

0

3,存儲在web根目錄之外的文件夾中。

請確保該目錄是一個配置選項,因爲如果大小過大或者您增加了前端節點的數量,您可能希望將來存儲在單獨的計算機上。

2提示:

  1. 文件重命名爲一個GUID或一些獨特的與數據庫中存儲的真實姓名。這將防止任何重複的文件名衝突。
  2. 創建一個文件夾系統,以便並非所有文件都在同一個目錄中。文件夾中的文件數量有限制。並將路徑存儲在數據庫中。 (即日期文件夾[YYYY] [MM] [DD] [File.Ext])
2

不要將它們存儲在數據庫中。把它們放在一個網站目錄像上傳和使用的.htaccess

deny from all 

這將限制對它們的訪問保護它們。

您還應該照顧文件名以避免文件命名衝突。

+0

+1謝謝教授! :) – Rahul

+0

在某些託管計劃中,您必須將內容存儲在Web目錄中,並按照與.htaccess所述的方式進行操作。如果您對服務器有更多的控制權,我強烈建議將圖像放在網絡目錄外面,以避免將來出現一些錯誤,其中包括意外丟失.htaccess文件(由於升級或其他配置更改),現在所有這些私人文件被暴露。在網絡目錄之外時這是不可能的。 –

1

將您的圖片存儲在受保護的目錄中,並拒絕您的.htaccess訪問。
deny from all

當用戶上傳圖片時,應該在圖片商店中創建唯一的文件名。然後,您可以使用圖像處理器使用特定圖像ID來提供圖像:

<?php 
    header('Content-Type:image/jpeg'); 
    if(authorized && isset($_GET['id'])) 
    { 
     flush(); 
     readfile('someimage' . $_GET['id'] . '.jpg'); 
    } 
?> 
相關問題