假设我的项目文件夹为www,环境:centos+nginx+php
我的设想是www设置744
然后把nginx(php)操作文件的时候使用第一个权限组(7),而不是第三个权限组(4).
就像win03环境下为文件夹添加一个用户(iis),然后PHP就可以具有权限(7).
我试着把www所有者改为nginx一样无效 chown -R nginx:nginx www
PHP操作文件的时候到底属于那个用户组?
你这样设置是错误的,如此一来,php脚本将有权限向整个网站任何目录写入、删除文件。这完全不符合最小化权限原则,也容易造成网站被恶意入侵、篡改之问题。
要设置安全的权限系统,你要先弄清楚以下几个问题:
1. 网站的文件所有者帐号是什么?
2. apache/php-fpm以什么帐号身份运行?
3. 网站哪些目录需要有写入权限(如日志生成、附件上传等)
针对这个问题,建议的设置如下:
1. 网站所有者,可设置为ftp, www帐号
2. nginx/php-fpm/apache,建议以nobody帐号运行,反正不能使用网站文件所有者帐号。
3. 需要可写权限的目录,手工设置权限为777即可
4. php生成的日志、附件文件的所有者会是nobody, 这时www,ftp帐号却无法修改、删除这些文件。那么在php生成文件时,可调用chmod($filename, 0777)。即解钤还需系钤人。
这样,php脚本只能向指定的目录中写入文件,一方面规范了程序代码的行为,另一方面,也一定程度上提高了网站的安装性。
######回复 @小竹子哥 : 日志、附件设置为777,没有问题######在严格检测上传文件的情况下(只允许图片),chmod -R 777 是否有危害######要把Windows上的习惯改掉。addgroup nginx --system adduser nginx --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false
网站根目录的所有者不能设为Nginx用户,可以是你上传文件的用户。
网站目录基本的权限设置(目录755,文件644):
find -type d -exec chmod 755 {} \;
find -type f -exec chmod 644 {} \;
也就是说Nginx和PHP-FPM只能读文件和访问目录。
对于特别的目录,比如文件上传目录,需要给Nginx写权限,这时可以设为777:
chmod 777 www/uploads
但注意配置该目录不做PHP解析,比如:
location ~ \.php$ { include fastcgi_params; if ($uri !~ "^/uploads/") { fastcgi_pass 127.0.0.1:9000; } fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /path/to/www$fastcgi_script_name; }
另外还有像缓存目录需要写权限的目录同样可以这样配置。
其实PHP可以很安全,只要你想去保护她。######好的######回复 @月影又无痕 : 编译安装需要自己新建,也不麻烦。我的环境也是编译的,全部放到一个目录去。yum安装使用的是系统通用目录,不太方便开发管理。######回复 @eechen : 原来是这样,你是用yum安装的,我一般用源码编译的。都是殊途同归######回复 @月影又无痕 : apt-get或者yum安装的Nginx官方源的二进制包会自动新建这样一个用户和组,我提供的用户新建语句就是Nginx官方安装时使用的脚本语句。PHP-FPM使用和Nginx同样的用户,跟以前的Apache(mod_php)一样,只需一个用户,并不多余。######不要建立那么多帐号,使用默认的nobody就行了。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。