搜索全站
安全防护 8 分钟阅读

WordPress 文件权限 644 与 755 详解:正确设置与风险边界

文件权限设置不当会导致"无法安装插件""需要 FTP 凭据"或被挂马。本文讲清 644/755 的含义、目录与文件的区别、属主用户的判断方法、wp-config.php 的特殊权限,以及为什么 777 是危险的,附一键修复脚本与 SELinux 环境的额外处理。

U
UFO_PF 2021-10-03 · 阅读 8 分钟
Wo 安全防护
阅读提示
本文约 2,931 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:权限问题有两个极端,都不安全

一个极端是”什么都写不了”:后台装插件弹 FTP 凭据、上传图片失败、更新提示无法创建目录。另一个极端是图省事 chmod -R 777,站点能写了,但任何人(包括被上传的恶意脚本)也能写。

正确做法只有一套:目录 755、文件 644、属主是 Web 服务用户。

原理分析:数字权限到底代表什么

Linux 权限分三组:属主(u)、属组(g)、其他(o)。每组三个位:读(r=4)、写(w=2)、执行(x=1)。

755 = u:rwx(7) g:r-x(5) o:r-x(5)
644 = u:rw-(6) g:r--(4) o:r--(4)
777 = u:rwx g:rwx o:rwx   ← 所有人可写,危险

目录需要 x(执行)位才能进入,所以目录是 755;文件不需要执行,是 644。

关键点:权限是给”谁”的。WordPress 的文件操作由 PHP 进程执行,PHP 进程以某个用户身份运行(Ubuntu 上是 www-data,CentOS 上是 nginx 或 apache)。所以决定能否写入的是:

  1. 文件的属主是不是 PHP 运行用户;
  2. 属主位(u)有没有写权限。

chmod 777 之所以”能解决”,是因为它对”其他”组也开放了写权限——但这也意味着服务器上任何进程都能写你的文件。

保姆级实操

第一步:确认 PHP 运行用户

# PHP-FPM
ps aux | grep -E 'php-fpm' | grep -v grep | head -3

# 或用配置查
grep -E '^(user|group)' /etc/php/8.2/fpm/pool.d/www.conf

# Apache
ps aux | grep -E 'apache|httpd' | grep -v grep | head -3

第二步:设置属主

# Ubuntu/Debian(PHP-FPM 用户 www-data)
sudo chown -R www-data:www-data /var/www/mimangfei.com

# CentOS/RHEL(Nginx + php-fpm 用户 nginx)
sudo chown -R nginx:nginx /var/www/mimangfei.com

第三步:设置权限

cd /var/www/mimangfei.com
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

第四步:特殊文件加强保护

chmod 600 wp-config.php        # 仅属主可读写(推荐)
chmod 640 wp-config.php        # 属主可读写、属组可读(部分环境需要)
chmod 600 .htaccess

wp-config.php 含数据库密码,权限收紧到 600 是标准做法。注意:如果 PHP 运行用户不是属主,600 会导致 WordPress 读不到配置——这种情况下先改属主。

第五步:uploads 目录

如果 PHP 用户是属主,uploads 保持 755 即可(属主位有写权限)。如果属主是普通用户(比如你用 SSH 上传的文件),则需要 775 并加属组。

第六步:一键修复脚本

#!/usr/bin/env bash
# fix-perms.sh <站点目录> <web用户>
set -euo pipefail
DIR="${1:?用法: $0 <站点目录> [web用户]>}"
USER="${2:-www-data}"

chown -R "$USER":"$USER" "$DIR"
find "$DIR" -type d -exec chmod 755 {} \;
find "$DIR" -type f -exec chmod 644 {} \;
chmod 600 "$DIR/wp-config.php" 2>/dev/null || true
echo "权限修复完成:$DIR(属主 $USER)"

第七步:禁止 uploads 目录执行 PHP

权限之外还要在 Web 服务器层拦截:

location ~* ^/wp-content/uploads/.*\.php$ {
    deny all;
}

SELinux 环境(CentOS / Alibaba Cloud Linux)额外处理

权限正确但仍无法写入时,多半是 SELinux:

sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/mimangfei.com(/.*)?"
sudo restorecon -Rv /var/www/mimangfei.com
sudo setsebool -P httpd_can_network_connect 1

排查命令:

ausearch -m AVC -ts recent     # 查看被拒绝的操作
ls -Z /var/www/mimangfei.com   # 查看上下文

常见踩坑与失败案例

  1. chmod -R 777 后仍无法写入 —— 说明不是权限问题,而是属主不对或 SELinux 拦截。
  2. 案例:某站长为了解决”需要 FTP 凭据”,把整个站点设成 777,两周后 uploads 目录被发现 shell.php,站点被用作跳板。正确解法是 chown -R www-data:www-data,一行命令就够。
  3. wp-config.php 设成 600 后站点白屏 —— PHP 运行用户不是属主。用 chown www-data:www-data wp-config.php 修正。
  4. 通过 root 执行 git pull 后权限被改 —— 部署时应统一用 deploy 用户,并在部署脚本末尾跑一次权限修复。
  5. 共享主机无法 chown —— 只能用面板里的”文件管理器”改权限,或联系主机商。
  6. Windows 服务器 —— 没有 755/644,用 icacls 给 IIS AppPool\站点名 授权(见 IIS 部署篇)。

总结

权限问题记住三句话:目录 755、文件 644、属主是 PHP 用户;wp-config.php 收到 600 或 640;永远不要用 777。另外,权限只是第一道防线,配合”uploads 目录禁止执行 PHP”和 SELinux 上下文,才算把写入风险真正控制住。把 fix-perms.sh 存进你的运维脚本库,每次部署后跑一次,能省掉一大类莫名其妙的故障。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。