WordPress文件上传防护,禁止上传php脚本到上传目录
WordPress 的上传目录(wp-content/uploads)如果允许执行 PHP 脚本,一旦攻击者把伪装成图片的 webshell 传上去,就能通过浏览器直接运行恶意代码,网站可能被完全控制。
禁止这个目录执行 PHP 是 WordPress 文件上传防护里最基础也最有效的一步。
本文用 Nginx 和 Apache 两种常见环境演示具体配置方法,按步骤操作后即可用测试文件验证是否生效。
配置前需要准备什么
在动手之前,请确认以下几点:
- 你能访问网站根目录和配置文件。宝塔面板用户直接在「网站 → 设置 → 配置文件」里操作;命令行用户需要 SSH 权限。
- 你的服务器 Web 环境是 Nginx 还是 Apache,两者配置方式不同。
- 建议先备份将要修改的配置文件,例如把
nginx.conf复制一份为.bak,避免改错后无法恢复。
本方法不会影响 WordPress 正常功能,因为 WordPress 核心并不会从 uploads 目录执行任何 PHP 文件。
Nginx 环境:在站点配置里封禁 PHP
Nginx 没有 .htaccess 机制,需要修改站点配置文件。
以宝塔面板为例:
- 打开「网站 → 设置 → 配置文件」,找到
server { ... }代码块。 - 在
location相关配置之前,添加下面这段规则:
location ~ ^/wp-content/uploads/.*\.(php|php5|php7|phar)$ {
deny all;
}
这段配置的含义:当访问 wp-content/uploads/ 下以 .php、.php5、.php7、.phar 结尾的文件时,直接返回 403,禁止访问。
- 保存配置后,先执行配置测试命令确认没有语法错误:
nginx -t
- 测试通过后重载 Nginx:
nginx -s reload
如果你的站点使用了 CDN 或对象存储,还需要在源站配置中同样加上这条规则,否则攻击者可能直接绕过源站。
Apache 环境:用 .htaccess 拒绝执行 PHP
Apache 环境最简单的方式是在上传目录下放置一个 .htaccess 文件。
如果你之前没启用伪静态,依然可以用这种方法。
进入 wp-content/uploads 目录,新建或编辑 .htaccess,写入以下内容:
Require all denied
如果服务器是 Apache 2.2 及以下旧版本,
需要把 Require all denied 换成 Order allow,deny 和 Deny from all,
建议优先升级到新版本。
修改后重启 Apache 服务,或等待配置自动生效。
注意 .htaccess 方式要求 Apache 开启了 AllowOverride,如果配置不生效,可以去虚拟主机配置里改用 块:
Require all denied
验证防护是否真的生效
配置完成不是终点,一定要实测验证。
- 在
wp-content/uploads目录下新建一个测试文件test.php,里面写入:
- 通过浏览器访问
https://你的域名/wp-content/uploads/test.php。
预期结果有两种:
- 返回 403 Forbidden,说明 PHP 已被禁止执行,防护正常。
- 页面显示
BLOCKED,说明配置没生效,需要检查配置文件位置或重载服务。
- 验证完成后,立即删除
test.php,避免留下测试残留。
常见问题与避坑说明
为什么一定要禁止上传目录执行 PHP?
因为 uploads 是允许访客或后台间接写入文件的地方,攻击者把恶意脚本伪装成图片上传后,如果服务器把 .php 当作普通文件执行,整站就失守了。
配置过程中有几点经常踩坑:
- 规则冲突:如果 Nginx 有其他
location规则作用于 uploads,可能会覆盖你的deny all。把新规则放在精确匹配或优先级更高的位置可以避免。 - 宝塔防篡改插件:开启防篡改后,直接写入
.htaccess可能失败,需要临时关闭插件或把该路径加入白名单。 - 别误伤图片处理插件:有些图片压缩插件会生成临时 PHP 文件,如果它们确实需要执行,请评估后单独放行,而不是全部禁止。
- 备份意识:修改配置前备份,改完必须重载服务,这两步不能省。
如果你的网站还在用旧版 PHP 或老主题,建议排查一下是否还有其他可写的目录(比如 wp-content/cache)也放行了 PHP,按照同样思路一并处理,安全性会更高。
完成以上配置后,你已经在 WordPress 文件上传防护上堵住了一个关键漏洞。
如果你用的环境比较特殊,比如 Windows 服务器或 Docker 容器,配置路径会略有不同,但核心思路不变:上传目录只放行静态资源,任何 PHP 请求都直接拒绝。
遇到异常时,优先检查配置位置是否正确、服务是否重新加载,以及有没有被其他规则覆盖。