本文目录导读:

HTTP劫持(通常指中间人攻击或运营商/路由器恶意篡改响应)的防护加固需要从传输层加密、内容完整性校验、客户端检测三个维度综合实施,以下是具体加固方案:
强制全站 HTTPS(最核心手段)
HTTP劫持的本质是明文传输,HTTPS 的 TLS 加密可以防止内容被篡改。
- 301 重定向:配置 Web 服务器(Nginx/Apache),将所有 HTTP 请求 301 重定向到 HTTPS。
- HSTS 头:在 HTTPS 响应头中添加
Strict-Transport-Security,强制浏览器在未来指定时间内(如max-age=31536000; includeSubDomains)只通过 HTTPS 访问。 - CDN 支持:如果使用 CDN,确保 CDN 回源也是 HTTPS,并启用 CDN 的 HTTPS 加速。
内容完整性校验(应对 CDN 或中间缓存劫持)
HTTPS 无法部署或作为第二道防线,对传输内容进行签名。
- Subresource Integrity (SRI):在
<script>或<link>标签中使用integrity属性,浏览器会计算资源哈希值,如不匹配则拒绝加载。<script src="https://cdn.example.com/app.js" integrity="sha384-...(资源hash)" crossorigin="anonymous"></script> - 数字签名:对敏感 API 响应或 HTML 片段(如支付信息)进行服务端签名,客户端验证签名后再渲染。
- 页面指纹:对核心页面(如登录页)的关键 DOM 元素生成哈希,在客户端通过 JS 对比,出现异常则弹出警告。
服务端与网络层加固
- DNS 安全:使用 DNSSEC 防止 DNS 劫持指向恶意 IP。
- CDN 配置:启用 CDN 的 HTTPS 回源,并配置 HTTP/2 或 HTTP/3(QUIC),降低中间人篡改概率。
- HSTS Preload:将域名提交到浏览器的 HSTS Preload 列表(如
hstspreload.org),避免首次访问时 HTTP 请求被劫持。
客户端主动检测与防御
- 前端劫持检测:在页面加载完成后,使用 JavaScript 脚本检测自身页面是否被篡改(如对比
document.documentElement.outerHTML哈希)。 - 动态加载资源:避免静态引用第三方资源,改为通过 JS 动态创建
<script>并验证其哈希(结合 CSP 的 nonce 属性更佳)。 - WebSocket 安全:对敏感数据(如实时通信)使用
wss://协议,并服务端校验 Origin 头。
运营商/路由器劫持(中国特色场景)
- 关闭公网 IP 的 80/443 端口:如无必要,不在公网直接暴露 HTTP 服务;国内运营商常对 HTTP 流量进行注入(如加弹窗广告)。
- 协议升级:使用 HTTP/2 的二进制分帧,一定程度上增加中间设备篡改难度(但仍需 TLS 保护)。
- 开启 CSP(内容安全策略):通过
Content-Security-Policy头限制脚本、样式、图片等资源的加载源,防止被注入恶意脚本。Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-随机值'; style-src 'self' 'unsafe-inline';
监控与应急响应
- 主动扫描:用模拟浏览器工具(如 Puppeteer)定期抓取自己的页面,比对源代码是否被运营商(如移动、联通)注入广告或跳转代码。
- CDN 边缘审计:如果使用自建 CDN,在边缘节点对回源响应进行哈希校验,发现篡改立即切换节点。
- 日志分析:监控 Web 服务器日志中异常的
User-Agent、Referer 或响应头(如运营商插入的X-Cache头),建立劫持特征库。
常见陷阱与误区
- 仅 HTTP 跳转 HTTPS:若首次请求仍为 HTTP,跳转响应本身可能被劫持(需要 HSTS 配合)。
- CDN 未开启 TLS 回源:CDN 到源站之间的 HTTP 通信可能被内网劫持。
- 问题:HTTPS 页面中加载了 HTTP 资源(如图片、iframe),这些资源可能被篡改影响页面完整性。
对于生产环境,HTTPS + HSTS Preload + CSP + SRI 是当前最稳妥的组合方案,如果无法全面部署 HTTPS(例如老旧系统),至少对敏感页面(登录、支付)强制 HTTPS,并对所有动态资源使用 Subresource Integrity 进行完整性校验。