WordPress配置FS_CHMOD_DIR时0775 & ~ umask()代码含义咨询
这行配置是WordPress用来定义程序自动创建新目录时使用的默认权限值的,0775 & ~ umask()是类Unix环境下非常经典的权限计算写法,完全适配系统本身的权限规则,具体逻辑如下:
基础概念铺垫
类Unix系统(Linux、macOS、各类BSD等)的文件/目录权限用八进制数值表示,每一位对应一组用户的读、写、执行权限:
- 数值从左到右三组分别对应:文件所有者、所属用户组、其他所有用户
- 单个权限的数值:读=4、写=2、执行=1,把需要的权限数值相加就是单组的权限值
比如0775的含义就是:所有者可读可写可执行(4+2+1=7)、组内用户可读可写可执行(4+2+1=7)、其他用户可读可执行(4+1=5),是Web服务目录非常常用的基础权限配置。
运算逻辑逐段拆解
整个表达式是按位运算,三个部分各有用处:
umask():PHP内置函数,会返回当前系统配置的权限掩码,你可以直接把它理解成系统级的权限黑名单:掩码里某一位是1,就代表新创建的文件/目录绝对不能给对应位置的权限。常见的默认umask值有0022(屏蔽组用户、其他用户的写权限)、0002(仅屏蔽其他用户的写权限)两种。~:按位取反运算符,会把umask返回值的二进制位全部翻转:原来黑名单里要屏蔽的位(值为1)取反后变成0,原来允许的位(值为0)取反后变成1,最终得到一个「权限白名单」,只有白名单里的位是1。&:按位与运算符,运算规则是两个数对应二进制位都为1时,结果位才为1,否则为0。这一步的本质就是拿预设的0775权限和刚才算出来的系统权限白名单做比对,只有两边都允许的权限位才会保留。
实际运算效果示例
拿最常见的系统默认umask0022举例:
- 预设权限0775转二进制(仅看有效权限位):
111 111 101 - umask值0022转二进制:
000 010 010 - umask按位取反后得到白名单:
111 101 101 - 做按位与运算后结果为
111 101 101,转八进制就是0755
也就是说如果系统umask是0022,WordPress创建目录的实际权限就是0755,完全符合系统默认的安全要求,不会给组用户、其他用户多余的写权限。
如果是共享主机环境常用的umask0002,运算后结果还是0775,会保留组用户的写权限,方便多个站点管理员共同维护文件,不需要手动修改WordPress配置。
为什么不直接写死0775?
直接硬编码权限值会有两个明显问题:
- 如果系统配置了更严格的umask规则,硬写0775会直接绕过系统安全策略,导致目录权限过宽,容易被入侵
- 不同主机环境的权限要求不一样,用这种动态计算的方式,只要调整系统层面的umask配置就能自动适配,WordPress本身不需要改配置,兼容性强得多
补充:这个计算逻辑不是WordPress独创的,系统原生的
mkdir命令创建目录时,底层默认用的就是0777 & ~umask()计算最终权限,WordPress只是把系统默认的基础权限从0777改成了更安全的0775,同时保留了和系统权限规则适配的逻辑。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

