nginx+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{}中包含它。

_____________________________________________________________________________________

方法1)在Nginx配置文件中加入

fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/";
通常nginx的站點配置文件裏用了include fastcgi.conf;,這樣的,把這行加在fastcgi.conf裏就OK了。
如果某個站點需要單獨設置額外的目錄,把上面的代碼寫在include fastcgi.conf;這行下面就OK了,會把fastcgi.conf中的設置覆蓋掉。
這種方式的設置需要重啓nginx後生效。


方法2)在php.ini中加入:
[HOST=www.server110.com]
open_basedir=/home/www/www.server110.com:/tmp/:/proc/
[PATH=/home/www/www.server110.com]
open_basedir=/home/www/www.server110.com:/tmp/:/proc/
這種方式的設置需要重啓php-fpm後生效。

方法3)在網站根目錄下創建.user.ini並寫入:
open_basedir=/home/www/www.server110.com:/tmp/:/proc/
這種方式不需要重啓nginx或php-fpm服務。安全起見應當取消掉.user.ini文件的寫權限。
關於.user.ini文件的詳細說明:
http://php.net/manual/zh/configuration.file.per-user.php

設置open_basedir的同時最好禁止下執行命令的函數,比如:
shell_exec('ls /etc')仍然查看到/etc目錄的文件列表
shell_exec('cat /etc/passwd')仍可查看到/etc/passwd文件的內容

建議禁止的函數如下:
disable_functions = pcntl_alarm, pcntl_fork, pcntl_waitpid, pcntl_wait, pcntl_wifexited, pcntl_wifstopped, pcntl_wifsignaled, pcntl_wexitstatus, pcntl_wtermsig, pcntl_wstopsig, pcntl_signal, pcntl_signal_dispatch, pcntl_get_last_error, pcntl_strerror, pcntl_sigprocmask, pcntl_sigwaitinfo, pcntl_sigtimedwait, pcntl_exec, pcntl_getpriority, pcntl_setpriority, eval, popen, passthru, exec, system, shell_exec, proc_open, proc_get_status, chroot, chgrp, chown, ini_alter, ini_restore, dl, pfsockopen, openlog, syslog, readlink, symlink, popepassthru, stream_socket_server, fsocket, chdir


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章