2013-07-30 79 views
1

我最近接到的任務是打開允許可信用戶上傳和存儲的小型網站的子域文件作爲遠離其本地磁盤的備份。通常,這個新的子域將被用來主要存儲靜態的Office類型的文檔(例如Microsoft/OpenOffice文檔,PDF,純文本文件等)。在Apache服務器的子域上禁用可執行代碼(CGI/SSI/PHP/etc)

我想確保一個天真的用戶無意中上傳一個可能致命的文件(例如,一些討厭的PHP腳本。理想情況下,我想關閉PHP和其他任何可能存在安全風險的東西(CGI進程,服務器端包含等)。

我只是想知道,如果堆棧溢出社會可以幫助回答以下問題:什麼是關閉與動態/可執行代碼處理所有類型的文件/進程的最佳途徑,所以在效果的子域只不過是一個基本的靜態文件服務器?

我在Google上看過使用各種關鍵字/短語,但似乎無法找到一個很好的參考,以使子域「安全」,因爲它可以從共享服務器的級別權威。

該網站在典型的LAMP架構上的Apache 2.2上運行,並託管在第三方共享服務器上。

DO訪問:

  • .htaccess(典型的特權/限制目錄級別)
  • php.ini.user.ini(典型的特權/限制目錄級別)
  • 控制面板軟件一些相當大方的選擇和功能(cPanel X
  • 相當不錯具有優良的技術支持服務xible網絡主機

DO NOT有機會獲得:(!明明)

  • root訪問權限
  • httpd.conf
  • php.ini(應用程序服務器級別)
  • mysql.cnf

請注意,我沒有資源投資文件服務器或將其外包給第三方服務。此外,該服務器不會用於CDN意義上,因此性能並不是真正的問題。

(另外,我不知道什麼可以做關於客戶端腳本,例如JavaScript的/ VBScript中,但任何建議將受到歡迎。)

提前感謝!

回答

1

簡單。不要直接訪問這些文件。通過PHP腳本運行一切,該腳本提供的內容爲application/octet-stream。例如

<?php 

$id = $_GET['id']; 
$data = get_file_details_from_database($id); 
if (user_is_allowed_to_access($id)) { 
    header('Content-type: application/octet-stream'); 
    readfile($data['path_to_file_on_server']); 
} 

有了這個不要緊,在所有他們上傳什麼樣的文件 - 它永遠不會是直接訪問通過直接http://example.com/nastyfile.php型URL。如果僅使用其內部ID號將文件存儲在驅動器上,而不是使用用戶提供的文件名,則可以獲得更高的安全性。網絡服務器可能會嘗試執行nastyscript.php,但如果驅動器上只有12345,服務器將不知道如何處理它。

+0

謝謝Marc。這是一個非常有用的建議,我將確保將上面的PHP代碼片段保留在我的「工具箱」中。然而,正如我所提到的,這個網站有效地運行着一個業餘愛好者,我不會擁有資源(無可否認,技術能力!)通過其內部ID號存儲文件。 更具體地說,是否有任何指令可以在共享服務器用戶的權限級別輸入,例如在我的根目錄'.htaccess'或本地'php.ini'文件中? –

+0

你需要什麼資源?一個簡單的數據庫記錄文件的元數據(誰上傳,原始文件名,auto_increment ID號碼),你就完成了... –

相關問題