开发者社区> 问答> 正文

关于linux下php权限问题:报错

假设我的项目文件夹为www,环境:centos+nginx+php

我的设想是www设置744
然后把nginx(php)操作文件的时候使用第一个权限组(7),而不是第三个权限组(4).
就像win03环境下为文件夹添加一个用户(iis),然后PHP就可以具有权限(7).

我试着把www所有者改为nginx一样无效 chown -R nginx:nginx www

PHP操作文件的时候到底属于那个用户组?

展开
收起
kun坤 2020-06-20 13:22:12 1097 0
1 条回答
写回答
取消 提交回答
  • 你这样设置是错误的,如此一来,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上的习惯改掉。

    Nginx和PHP-FPM运行用户都使用Nginx,这个用户是一个不能登录的普通用户, yum安装时会自动新建,自己编译安装的话需要手动新建:
    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就行了。
    2020-06-20 13:22:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载