
核心要点(TL;DR)
- 网页防篡改的核心是基线哈希+定时比对+自动回滚三步闭环。
- 静态页面用 sha256 基线即可,动态站点需结合文件监控与权限最小化。
- 自动恢复前必须先隔离被篡改文件,避免覆盖证据。
- 仅靠监控不够,Web 目录应设为只读并对写入操作单独授权。
页面被挂马、首页被换成黑链,往往要等搜索引擎或用户投诉才发现——这是很多站长最被动的时刻。本文给出一套可落地的网页防篡改配置流程:先用哈希建立可信基线,再定时比对发现变化,最后自动隔离并回滚,让篡改在分钟级被发现和修复。
一、网页防篡改到底在防什么
网页防篡改的本质是保证线上文件与可信版本一致。攻击者常见手法包括替换首页、插入暗链、上传 webshell、篡改 JS 引流。防御思路分三层:
- 完整性:用哈希值判断文件是否被改。
- 实时性:定时或事件触发,缩短发现窗口。
- 可恢复:保留可信副本,一键回滚。
只监控不恢复,等于只报警不灭火;只备份不校验,则无法判断备份是否已被污染。
二、第一步:生成静态页面哈希基线
以 Nginx 站点目录 /var/www/site 为例,先生成基线清单:
cd /var/www/site find . -type f \( -name '*.html' -o -name '*.js' -o -name '*.css' \) \ -print0 | sort -z | xargs -0 sha256sum > /opt/waf/baseline.sha256 chattr +i /opt/waf/baseline.sha256
要点:
- 用
sort -z保证顺序稳定,避免误报。 - 基线文件加
chattr +i防篡改。 - 排除缓存、上传、日志目录,减少噪音。
三、第二步:定时比对与告警
写一个比对脚本 /opt/waf/check.sh:
#!/bin/bash cd /var/www/site sha256sum -c /opt/waf/baseline.sha256 --quiet > /tmp/diff.log 2>&1 if [ -s /tmp/diff.log ]; then mkdir -p /opt/waf/quarantine/$(date +%F_%H%M) grep -oP '(?常见问题(FAQ)
网页防篡改系统一定要买商业产品吗?
不一定。对中小站点,用 sha256 基线、cron 定时比对加 rsync 回滚即可搭出可用的防篡改闭环,成本低且可控。商业产品的价值在于实时监控、集中管理和审计报表,当站点数量多或合规要求高时再考虑引入,先用脚本跑通流程更稳妥。
哈希校验多久跑一次比较合适?
静态页面建议每 5 到 15 分钟比对一次,访问量大的站点可缩短到 1 分钟;同时用 inotify 做实时写入监控作为补充。频率过高会带来 IO 压力,可先统计单次校验耗时,确保不超过间隔的三分之一,再决定最终周期。
自动恢复会不会把攻击者留下的后门一起覆盖?
正确做法是先隔离再恢复。发现不一致时把被改文件移动到隔离目录保留证据,再从可信备份同步回原位置,并立即排查 Web 日志与上传目录。直接覆盖会丢失溯源线索,也可能遗漏攻击者新建的隐藏文件。
动态站点(如 PHP、Java)也能用哈希校验吗?
可以,但要区分目录。程序代码、模板、配置文件应纳入校验并设为只读;缓存、上传、日志目录排除在外。动态站点还需配合最小权限运行、禁用危险函数和上传目录禁止执行,单靠哈希只能发现篡改,不能阻止入侵。
发现页面被篡改后第一步做什么?
先隔离而非删除:停止对外写入、备份现场、记录时间点,再比对基线找出全部变动文件。随后从可信源恢复、修补入口漏洞、轮换密钥,最后复盘日志确认是否留有后门,避免恢复后再次被改。