. proftpd建立hostuser/hostuser帳號,所有使用者均映射到該帳號。
htdocs/hosts 目錄屬主也為hostuser
這樣使用者使用FTP上傳的檔案屬性為hostuser(644 755)。
將FTP鎖定使用者在自己的主目錄下。
apache以nobody運行(以獨立apache使用者更好),讀hostuser的指令檔。
對於要寫入的目錄uploads和cache,必須設定777,且迴圈設定其子目錄。兩個目錄禁止指令碼執行(.htaccess:php_flag engine off)。這樣即使駭客上傳webshell到這兩個目錄,也無法執行。
這樣cache或uploads中的新檔案的屬主將是nobody
cache目錄要限制對外訪問。
這裡存在一個問題,就是apache產生的檔案和目錄644和755,當proftpd以hostuser:hostuser運行時,使用者是無法刪除cache或uploads中的內容的。
解決方案:
(1) 在PHP程式中chmod檔案和目錄分別為666和777
以adodb為例,需修改adodb.inc.php檔案1681行if (!mkdir($dir,0771)) 和adodb-csvlib.inc.php檔案287行chmod($tmpname,0644);兩個地方
(2) 讓使用者在系統裡面清空cache和uploads
2. PHP safe_mode,它的主要作用是讀寫檔案時會檢查當前指令碼和要讀寫或修改的檔案屬主是否一致,如果不一致就拒絕修改。
不過,如果當前指令碼屬主是hostuser,要刪除屬主是nobody的uploads目錄下的檔案,一旦safe_mode開啟,就不能寫了。
所以safe_mode預設是不開啟的,
其替代方案為:
php_admin_value open_basedir /docroot 限制每個使用者只能訪問自己的檔案。這裡的docroot是程式的根目錄,不是程式下的cache或uploads目錄。如果不是根目錄,PHP程式都無法訪問。
3. (不一定能保證)所有PHP程式指令碼能過濾Remote Code Execution和Local File Include攻擊。否則駭客仍有可能讀取config.php中的密碼,或者直接讀寫cache或uploads目錄中的內容。
cache目錄中不可存放類似使用者密碼之類的資料。
4. expose_php設為off ,這樣php不會在http檔案頭中泄露PHP的版本號碼.
Tips:Linux下預設檔案和目錄的mod為 檔案644 目錄755 (即666-22 777-22)umask 22