nginx + php-fpm fastcgi防止跨站、跨目录的安全设置
我们知道apache php mod的方式可以很方便的配置 open_basedir 限制各个站点的目录访问权限。
nginx + php-fpm fastcgi的方式需要这样做。
首先php的版本必须大于等于php5.3.3。
总限制 通过php-fpm.conf限制
在php-fpm.conf配置文件当中可以增加如下参数
1
2
3
4
5
6
7
8
9
|
env
[
TMP
]
=
/
tmp
/
env
[
TMPDIR
]
=
/
tmp
/
env
[
TEMP
]
=
/
tmp
/
php_admin_value
[
sendmail_path
]
=
/
usr
/
sbin
/
sendmail
-
t
-
i
-
f
webmaster
@
qq
.
com
php_admin_value
[
open_basedir
]
=
/
home
/
wwwroot
/
:
/
tmp
/
:
/
var
/
tmp
:
/
proc
/
php_admin_value
[
session
.
save_path
]
=
/
tmp
/
php_admin_value
[
upload_tmp_dir
]
=
/
tmp
/
slowlog
=
/
usr
/
local
/
php
/
var
/
log
/
$
pool
.
log
request_slowlog_timeout
=
3s
|
可以配置env,php_admin_value。
那么配置
1
|
php_admin_value
[
open_basedir
]
=
/
home
/
wwwroot
/
:
/
tmp
/
:
/
var
/
tmp
:
/
proc
/
|
就可以把整个php脚本的访问目录控制住了。
如果方法1 方法2 方法3未配置的情况下,那么open_basedir的值就为本设置的值,如果方法1 方法2 方法3设置了,那么就是新设置的值。
另外的我这里打开了php慢执行。
slowlog 写保存路径,request_slowlog_timeout写时间。
更多的请看php官网手册 http://www.php.net/manual/en/install.fpm.configuration.php
方法1 在nginx 配置 fastcgi_param参数
在nginx的 php配置中 或者 在 包含的 include fastcgi.conf 文件中加入:
1
|
fastcgi_param
PHP_ADMIN
_VALUE
"open_basedir=$document_root/:/tmp/:/proc/"
;
|
$document_root php文档根目录,就是 nginx 配置项 root 配置的网站目录。
/tmp/目录需要有权限,默认放seesion的位置,以及unixsock。
/proc/ 可以让php查看系统负载信息。
本方法加的各个vhost 虚拟主机,都可以完美使用。都限制到自己的网站目录下。
非常推荐使用, 总限制 + 方法1 这样的组合配置方式!!!!!
方法2 在php.ini 中配置
在php.ini的末尾加入:
1
2
3
4
|
[
HOST
=
www
.
iamle
.
com
]
open_basedir
=
/
home
/
wwwroot
/
www
.
iamle
.
com
:
/
tmp
/
:
/
proc
/
[
PATH
=
/
home
/
wwwroot
/
www
.
iamle
.
com
]
open_basedir
=
/
home
/
wwwroot
/
www
.
iamle
.
com
:
/
tmp
/
:
/
proc
/
|
本方法的弊端,如果有泛域名解析,比如 *.iale.com 。这个就不好控制。
方法3 网站根目录下增加 .user.ini 文件。
在php.ini中找到user_ini.filename 、 user_ini.cache_ttl 去掉前面的分号。
1
2
3
4
5
6
7
8
|
;
Name
for
user
-
defined
php
.
ini
(
.
htaccess
)
files
.
Default
is
".user.ini"
user_ini
.
filename
=
".user.ini"
;
To
disable
this
feature
set
this
option
to
empty
value
;
user_ini
.
filename
=
;
TTL
for
user
-
defined
php
.
ini
files
(
time
-
to
-
live
)
in
seconds
.
Default
is
300
seconds
(
5
minutes
)
user_ini
.
cache_ttl
=
300
|
在网站根目录下创建.user.ini 加入:
1
|
open_basedir
=
/
home
/
wwwroot
/
www
.
iamle
.
com
:
/
tmp
/
:
/
proc
/
|
这种方式不需要重启nginx或php-fpm服务。
特别注意,需要取消掉.user.ini文件的写权限,这个文件只让最高权限的管理员设置为只读。
方法1设置后,.user.ini的设置就不起作用了。
关于.user.ini文件的详细说明:
http://php.net/manual/zh/configuration.file.per-user.php