当你的网站明明配置了 CDN,但用户访问时却出现异常内容、跳转或脚本注入,这可能不是源站出了问题,而是 CDN 劫持响应。CDN 劫持指攻击者利用 CDN 配置缺陷、缓存投毒或中间环节篡改,向用户返回伪造或篡改的响应。本文将从实际问题切入,带你一步步识别劫持迹象,并利用 CDN 自身的缓存、防护和边缘计算能力进行处理。
第一步:识别劫持的典型迹象
检测 CDN 劫持,首先要区分是源站问题还是 CDN 节点问题。常见的迹象包括:
- 响应内容异常:页面出现非预期的脚本、广告或跳转,且源站直接访问时正常。
- 响应头异常:`Via`、`X-Cache`、`Age` 等头部缺失或值异常,或出现非 CDN 厂商的标识。
- SSL 证书不匹配:浏览器提示证书错误,或证书 CN/SAN 与域名不符。
- 访问延迟突变:同一资源在不同地区响应时间差异巨大,或 TTL 未到却频繁回源。
你可以使用 `curl -I` 查看响应头,对比源站与 CDN 节点的差异。例如,正常 Cloudflare 缓存会返回 `cf-cache-status: HIT`,若该字段缺失或值异常,则需警惕。
第二步:确认劫持源:缓存投毒还是边缘篡改
劫持可能发生在 CDN 缓存层,也可能发生在边缘节点到用户之间的链路。区分方法:
- 缓存投毒:攻击者利用 CDN 缓存规则缺陷,将恶意内容注入缓存。此时不同用户访问同一 URL 均返回恶意内容,且 `cf-cache-status` 显示 `HIT`。
- 边缘篡改:仅在特定网络或区域出现异常,源站和 CDN 缓存均正常,可能是中间人攻击或本地 DNS 污染。
你可以通过修改 URL 查询参数绕过缓存(如添加 `?nocache=1`)来测试:若绕过缓存后内容正常,则问题在缓存层;若仍异常,则可能涉及边缘链路。
第三步:利用缓存规则限制劫持面
Cloudflare 缓存文档指出,缓存会存储频繁访问的内容,并通过缓存规则优化哪些资源被缓存及缓存时长。合理配置缓存规则可减少劫持影响:
- 限制缓存范围:只对静态资源(如图片、CSS、JS)启用缓存,动态页面设置为不缓存或短 TTL。
- 设置 Cache-Control:在源站响应中明确 `Cache-Control: no-store` 或 `private`,避免敏感内容被缓存。
- 使用 Cache Rules:针对特定路径或文件类型定义缓存行为,例如对 `/admin/` 禁用缓存。
这些措施能降低缓存投毒的成功率,即使发生劫持,也能缩小影响范围。
第四步:启用 DDoS 防护与安全规则
部分劫持行为伴随 DDoS 攻击,攻击者可能通过大量请求压垮源站,或利用异常流量注入恶意缓存。Cloudflare DDoS 防护文档说明,其自动检测系统可识别并缓解多种 DDoS 攻击,包括网络层和应用层攻击。
你可以:
- 开启 HTTP DDoS 攻击防护 的托管规则集,自动拦截恶意请求。
- 自定义规则,对异常 User-Agent、高频访问 IP 进行质询或封禁。
- 启用 Bot Fight Mode 或 Super Bot Fight Mode,识别并阻止爬虫和恶意机器人。
防护规则可减少攻击面,间接降低劫持风险。
第五步:用 Workers 实现响应校验与修复
Cloudflare Workers 允许在边缘执行代码,可用于检测和修复被篡改的响应。例如,你可以编写一个 Worker,检查响应头或内容中的可疑模式,若发现异常则返回预设的安全响应或回源获取正确内容。
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const response = await fetch(request)
const contentType = response.headers.get('Content-Type') || ''
// 检查 HTML 响应是否包含可疑脚本
if (contentType.includes('text/html')) {
const text = await response.text()
if (text.includes('malicious-script')) {
return new Response('Blocked', { status: 403 })
}
}
return response
}
此代码仅作示例,实际使用时需结合具体劫持特征。Workers 还可用于动态改写 URL、添加安全响应头等,增强响应完整性。
第六步:验证处理效果与持续监控
处理完成后,需验证劫持是否被消除:
- 清除 CDN 缓存(Cloudflare 支持即时清除全部或特定文件)。
- 使用不同网络(如移动网络、不同 ISP)访问,确认异常消失。
- 持续监控响应头、证书和内容,设置告警规则(如通过 Workers 定时检查)。
同时,建议定期审查 CDN 配置,确保缓存规则、安全设置不过于宽松。
常见误区与失败条件
- 只改源站不查 CDN:若劫持发生在 CDN 层,源站修改无效。
- 忽略 HTTPS:未启用全站 HTTPS 时,明文传输内容易被篡改。
- 缓存规则过于宽松:对动态内容设置长 TTL,导致缓存投毒影响持久。
- 不验证 Worker 代码:错误代码可能导致正常响应被误杀。
若以上步骤无法解决问题,可能涉及更复杂的网络攻击,建议联系 CDN 服务商或安全专家。
参考资料
延伸阅读
