很多企业在运维大量老旧网站时,面临系统或框架版本过低、频繁被入侵挂马的困境。全面升级需要大量时间和成本,短期内难以完成。本文将介绍一种低成本、见效快的应急防护方案:通过统一访问入口、限制PHP文件执行,从Web服务器层面阻断webshell生效路径。
一、问题核心现象
公司运维大量网站,基于ThinkPHP 3.2/5.0旧版本框架或CMS搭建。这些系统漏洞多、补丁滞后,频繁遭遇入侵、挂马、webshell植入等安全问题。常规排查和临时清理无法根治,且全部升级到最新版本需要大量时间和人力成本。
二、问题根本原因
故障根源在于Nginx默认PHP配置允许所有.php文件执行。
默认配置中,include enable-php-74.conf; 这行代码使得服务器上任意位置的PHP文件都能被解析执行。
核心风险点:黑客通过漏洞上传webshell(如shell.php、hack.php等)后,直接访问即可执行恶意代码,获得服务器控制权。即使做了文件上传限制,其他代码执行漏洞依然可能让黑客写入并执行PHP文件。
三、防护思路与原理
现代PHP框架(如Laravel、ThinkPHP 6+)普遍采用单一入口模式——所有请求经过 index.php 路由分发。我们可以借鉴这一思想,实施白名单执行策略:
1. 统一访问入口:仅允许根目录下的 index.php(前台)和 admin.php(后台)执行PHP;
2. 其余PHP一律禁止:即使黑客上传了webshell,也无法运行;
3. 配合目录权限:上传目录禁止PHP解析,进一步缩小攻击面。
核心逻辑:黑客入侵的最终目的是执行恶意PHP文件维持控制。限制PHP执行入口,就能从根本上阻断webshell的生效路径。
四、完整修复操作步骤
1. 进入网站配置文件
登录宝塔面板,进入目标网站的设置页面。点击左侧的 「配置文件」(⚠️ 注意:不是「伪静态」)。
2. 定位冲突配置
在打开的配置文件中,找到这行代码:
include enable-php-74.conf;
这行代码就是导致所有PHP文件都能被执行的根源。
3. 替换为白名单配置
删除或注释掉 include enable-php-74.conf; 这一行,在原位置粘贴以下配置:
# 只允许根目录下的 index.php 执行(前台入口)
location = /index.php {
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-74.sock; # 确保路径与你的PHP版本匹配
fastcgi_index index.php;
include fastcgi.conf;
}
# 只允许根目录下的 admin.php 执行(后台入口)
location = /admin.php {
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi-74.sock; # 确保路径与你的PHP版本匹配
fastcgi_index admin.php;
include fastcgi.conf;
}
# 拒绝所有其他 .php 文件的访问
location ~ \.php$ {
return 404;
}
4. 保存并生效
点击 「保存」,宝塔会自动检测语法并重载Nginx,使配置生效。
五、关键注意事项
1. 修改位置:必须在「配置文件」中修改,而不是「伪静态」;
2. sock路径:确保 fastcgi_pass 后面的路径 unix:/tmp/php-cgi-74.sock 与你服务器上PHP的实际sock路径一致。如果不确定,可以查看被注释掉的 enable-php-74.conf 文件内容来确认;
3. 入口文件:根据项目实际情况调整白名单。如后台入口可能是 admin.php、manage.php,或某些项目使用 index.php?m=admin 等模式,需对应调整;
4. 上传目录:建议额外添加规则:location ~* ^/upload/.*\.php$ { return 403; } 禁止上传目录执行PHP;
5. 备份配置:修改前务必备份原配置文件,以便出现问题时快速回滚。
六、防护效果验证
配置生效后,可通过以下方式验证:
1. 正常访问网站前台和后台,确认业务不受影响;
2. 尝试访问任意非白名单的PHP文件(如 http://域名/test.php),应返回404;
3. 模拟上传webshell文件并访问,确认无法执行,返回404。
七、补充建议
此方案是应急防护手段,不能替代系统升级。建议同步做好以下工作:
1. 定期备份网站文件和数据库;
2. 监控异常文件变动,可用脚本定时扫描新增/修改的PHP文件;
3. 制定分阶段升级计划,逐步替换老旧系统;
4. 部署WAF(Web应用防火墙),在流量层面进行防护;
5. 对上传目录设置禁止执行权限,双重保险。
八、问题总结
1. 老旧网站被入侵挂马的根本原因是PHP执行面过宽,任意PHP文件均可运行;
2. 核心解决方案为统一入口 + 白名单执行,仅允许特定入口文件执行PHP;
3. 通过修改Nginx配置,用location规则精确控制PHP解析范围,不影响正常业务;
4. 该方案投入小、见效快,可为全面升级改造争取宝贵时间,但需配合长期升级计划彻底根治。