上周帮朋友看一个用了好几年的企业站,百度收录里居然冒出了很多博彩页面的快照,但直接打开首页又一切正常。后来抓包排查才发现,对方在 index.php 和主题模板里插了一段针对搜索引擎 User-Agent 的跳转代码。清理掉木马后没两天又被改了,典型的权限漏洞或插件后门还没找全。
在彻底审计代码的同时,为了防止源文件继续被黑客脚本改写,我顺手在宝塔面板里配置了网站防篡改程序把核心代码锁死。这里把排查思路和防篡改的实际配置细节记录下来,给遇到同类情况的朋友做个参考。
1. 暗链排查与紧急清理
大部分暗链之所以隐蔽,是因为黑客加了访问判断。通常只在判定访客来自百度、搜狗等搜索引擎蜘蛛,或者 Referer 来自搜索结果时才输出恶意链接或执行跳转。
排查时可以通过 curl 模拟搜索引擎爬虫请求:
bashcurl -A "Baiduspider" https://www.yourdomain.com/
如果返回的代码里多出了大量奇奇怪怪的内链,或者出现包含加密 eval、base64_decode 的脚本引用,基本就可以确认中招了。定位修改时间最近的文件:
bashfind /www/wwwroot/yourdomain.com -type f -name "*.php" -mtime -3
把被修改的文件用干净备份覆盖,并暂时切断可疑目录的写入权限。
2. 宝塔防篡改的拦截配置逻辑
宝塔的网站防篡改主要是基于内核级别的事件监控(inotify/内核驱动层),一旦有外部进程尝试修改、重命名或删除被保护的文件,系统会直接阻断并报警。防篡改生效的核心在于:该锁的一定要锁死,该放行缓存和上传的千万别锁错。
- 受保护目录:网站根目录
/www/wwwroot/yourdomain.com/。 - 受保护文件后缀:
php|html|htm|js|css|htaccess,如果是其他语言站点,酌情加上jsp|asp|aspx。 - 排除目录(重要):必须把静态资源上传目录(如
/uploads/、/wp-content/uploads/)以及系统缓存目录(如/runtime/、/cache/)排除在外。防篡改不要去管图片上传目录,图片目录的安全靠 Nginx 禁用 PHP 执行脚本来解决。
3. 不同机器配置下的策略与开销建议
防篡改程序由于需要监控底层文件系统事件,如果监控的文件数量过于庞大(比如数万个图片或静态缓存),会产生不必要的 CPU 和内存开销。合理设置监控范围能够保证服务器轻量稳定运行。
| 服务器配置 | 推荐监控文件数 | 监控策略建议 | 预估内存占用 |
|---|---|---|---|
| 1核 1G / 1核 2G | 5,000 以内 | 仅监控核心源码与系统目录,严格排除缓存与媒体库 | 约 30MB - 60MB |
| 2核 4G | 20,000 以内 | 全站脚本文件与公共前端组件监控,开启报警日志 | 约 60MB - 120MB |
| 4核 8G 及以上 | 50,000+ | 全站主程序代码及模板实时锁定,开启违规修改实时拦截 | 约 100MB - 200MB |
小内存机器特别需要注意,不要把监控深度设为监控全站所有 jpg/png/webp 等静态文件,不仅拖慢写入性能,还容易触发文件句柄数超限。
4. 日常维护时的避坑要点
开启防篡改后,很多站长常遇到的一个问题是“后台更新主题或插件直接报错失败”,或者“保存系统设置时提示无权限”。
这是正常现象,说明防篡改确实发挥了阻断作用。应对这种日常运维场景,推荐的流程是:
- 后台系统升级或改动代码前:先进入宝塔面板,将该站点的防篡改开关临时暂停。
- 执行更新/改动:在后台完成版本更新、配置更改,确认前台功能运行正常。
- 重新恢复保护:回到宝塔防篡改界面重新开启防护,程序会自动以当前最新的文件指纹为基准重新锁定。
只要核心业务代码被底层驱动锁死,哪怕攻击者利用上传漏洞写入了木马,他也无法替换 index.php 或修改核心框架文件挂载恶意暗链,站点的底线安全就保住了。