2012-05-10 64 views
8

我在幹什麼:如何安全地存儲在服務器上的文件

基本上,我需要通過創建PHP編寫的,一旦登錄,登錄頁面擔保的網站,你有一個搜索欄,上面寫着整數和數據被髮送到一個PHP腳本,該腳本用數字作爲名字來檢索圖像。

(我會存儲在該服務器上幾千個圖像進行搜索 - 庫存圖片)

-

我需要什麼幫助:

從我的研究,我理解你「不要」使用MySQL等數據庫來存儲實際的圖像,因爲速度和效率都很低。如果您沒有將其存儲在數據庫中,並且按照建議將其保留在服務器的文件系統上,如果有人在地址欄中鍵入直接URL,是不是會將它們帶到我的服務器上的文件中?

你如何防範這一點。我不想在我的服務器上沒有成功瀏覽登錄頁面的文件。

感謝您的任何幫助,任何見解或建議,將不勝感激。這對我來說很重要,因爲將來會增加更復雜的信息。

+2

你可以有一個目錄不能通過HTTP訪問,你可以使用php腳本來檢查用戶是否登錄,如果是,從指定的目錄中讀取文件並輸出。 –

+0

我已閱讀將文件保留在「public_html」文件夾中。這會使它完全無法從http訪問嗎? 那麼我的PHP腳本如何訪問這些文件呢? – DMor

+0

當使用Apache與cPanel時,'public_html'通常是從中提供文件的目錄。這意味着,當你鍵入'http:// yoursite.com'時,數據將從'/ var/www/username/public_html'中拉出。這也意味着,無論您在URL中輸入什麼,「/ var/www/username」都是**不可**。這也意味着你在那裏創建的目錄,比如'/ var/www/username/files'也不可訪問。從你的PHP腳本中,你可以用'file_get_contents('/ var/www/username/files/imagename.extension');'來訪問它。 –

回答

6

推薦的方式Ø f通過PHP(或任何其他腳本)處理文件下載是通過使用所謂的「X-Sendfile」響應頭。

PHP腳本處理身份驗證,一旦驗證,它將設置一些響應頭和一個'X-Sendfile',它告訴Web服務器傳送文件;腳本結束並且Web服務器接管。

在這裏看到一個簡單的例子:

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

我會研究這個,謝謝。 – DMor

0

你能做到這樣 寫的資源服務於PHP這樣

image.php?requestid=..... 
在該文件中,你得到的requestId和讀取數據庫中的實際鏈路(本地鏈路)

,讀取圖像文件,然後將數據輸出到瀏覽器

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

但我認爲你不應該這樣做,只是重命名文件隨機創建他們中的很多....

+0

他們需要保留原始號碼,這不是我的系統,而是根據僱用我的人的要求。 這足夠安全嗎?只要我的PHP腳本過濾請求,更正? – DMor

+0

GET永遠都不安全,即使POST也可能不足以保證安全性。 – ilhnctn

+0

@ilis - 您的評論有何意義? GET和POST是HTTP使用的方法,只有在解釋用戶輸入時被誤用時,它們纔是「不安全的」。 –

1

這可能是矯枉過正的situtation,但我這是怎麼想這樣做的一個應用程序我正在開發:

第一,有4個服務器,一個Web服務器,一箇中間件服務器和一個數據服務器,當有人向Web服務器發送請求時,Web服務器連接到中間件服務器並請求文件,用戶憑證,如會話密鑰和所請求的文件。中間件連接到數據庫並驗證會話和用戶對該文件的權限。它會返回一個錯誤或二進制數據(如果他們有權訪問)。如果關閉Web服務器和中間件服務器上的輸出緩衝,則可以將中間件服務器的100k塊發送到Web服務器,並且Web服務器將在接收第二個塊時輸出第一個塊。

文件本身可以存儲通過FTP,SFTP,或其他文件共享數據庫服務器上

它絕對不是爲使用X-sendfile的那樣有效,但如果有人能夠PWN你的web服務器,他們將仍然無法訪問文件 - 在上述情況下,他們會。 Web服務器是唯一的公共服務器,所以其餘服務器應該連接到專用網絡上。

,您還可以將數據發送到將加密/解密的實際文件數據

如果任何人有關於如何提高這個任何想法,我很感興趣的加密服務器。

+0

有趣的,但這肯定比我需要更復雜(但它是有趣的閱讀)。我當時並不知道.htaccess,它可以阻止查看整個文件夾。我已經實現了這一點。我有一個獲取數據的HTML登錄表單,將其發送給驗證用戶的處理腳本,如果驗證,則將用戶發送到搜索頁面。用戶輸入一個Item#併發送到另一個處理腳本,該腳本訪問數字爲主鍵的數據庫,並保存文件路徑和其他信息。如果存在,它將拉動文件路徑 – DMor

+0

圖像的文件夾受.htaccess(「DENY FROM ALL」)保護。我也使用SSL並將關於圖像的其他信息存儲在MySQL數據庫中 – DMor

相關問題