老旧网站防入侵实战:统一入口 + 限制PHP执行,低成本解决挂马难题

很多企业在运维大量老旧网站时,面临系统或框架版本过低、频繁被入侵挂马的困境。全面升级需要大量时间和成本,短期内难以完成。本文将介绍一种低成本、见效快的应急防护方案:通过统一访问入口、限制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.phpmanage.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. 该方案投入小、见效快,可为全面升级改造争取宝贵时间,但需配合长期升级计划彻底根治。