1. 程式人生 > >nginx+php 限制每個站點的目錄範圍,防止跨站

nginx+php 限制每個站點的目錄範圍,防止跨站

今天偶然發現,在php指令碼中可以訪問伺服器上任何目錄。


頓時一身冷汗啊。。


於是就上百度谷歌了半天,一開始就找到了一個php.ini中的open_basedir引數,設定這個引數即可限定php指令碼的訪問範圍。


我們針對每個站點,需要php能夠訪問該站點所在目錄以及/tmp/臨時目錄。


SO..看到有人這麼寫


open_basedir=.:/tmp/  


冒號的作用是隔開多個路徑,這裡面根據字面理解,第一個點就代表當前目錄。


看起來是很完美了,OK,儲存配置,重啟php-fpm


結果nginx 報502錯誤。


研究了一會,發現 . 這種相對路徑寫法,至少在nginx+phpfastcgi下是行不通的。


好吧,暫時妥協


open_basedir=/home/wwwroot/:/tmp/


這樣總行了,將php限制在所有站點的父目錄,這樣至少阻止了php訪問伺服器上web目錄以外的目錄。


到了這裡,還是有隱患的,只要wwwroot下任意一個站點被拿到webshell,那麼其他站點將不能倖免.


不甘心哪,度娘是找不到有用的資訊了,都是些垃圾複製貼上,於是去了谷歌。


搜了一下,找到一個遇到同樣問題的鬼佬,裡面有人給了一個方法,成功解決。


那就是在nginx 每個server下,加上


fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/"; 


重啟nginx,成功!你也可以把這行程式碼放到fastcgi.conf裡,前提是你得在server{}中包含它。


至此,nginx + php5.3 是沒有問題了。


然後我又在另外一臺vps上,環境是php5.2 發現此方法不生效。