1. 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的版本號.