nginx+php 限制每個站點的目錄範圍,防止跨站
阿新 • • 發佈:2018-12-23
今天偶然發現,在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 發現此方法不生效。
頓時一身冷汗啊。。
於是就上百度谷歌了半天,一開始就找到了一個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 發現此方法不生效。