對於在一臺伺服器上有多個虛擬主機的人來說,Apache有一個很好用的地方---配置php_admin_value,在裡面配置一下 open_basedir就可以了。
但是Nginx卻沒有這樣的設定,一旦某使用者在他的虛擬主機下上傳了一個WEBSHELL之類的東西,其他使用者資料就遭殃了,今天就來解決這樣的問題,怎麼樣讓使用者無法旁註。
第一步,需要在php.ini 設定open_basedir的值,比如網站目錄全部在 /www/web/ 下面,
例如 /www/web/xxx.com/ 下面是xxx.com網站
那麼我可以設定php.ini中 open_basedir="/www/web/:/tmp/" (注意,/tmp 必須設定,否則影響上傳檔案,如果你設定了 upload_tmp_dir ,那麼把/tmp設定成 upload_tmp_dir 的值)
然後執行
# chmod 755 -R /www/web/
# chmod 711 /www/web/
這時,網站依然能訪問,可是你試試上傳一個WEBSHELL,看看還能列 /www/web/的目錄麼?
但是問題又來了,如果說/www/web/下目錄命名非常有規律,很容易被猜解到,直接輸入 /www/web/xxx.com 就可以列別人的目錄。
別急,還有辦法,把 /www/web/xxx.com 重新命名為複雜的名字,比如 /www/web/xxx.com_41237415sdfad,
再把PHP.INI 裡面的 display_errors 關閉,攻擊者基本上就會放棄了。