1. 目标:防止第三方盗用带宽、保护静态资源和私有内容。
2. 风险:直接暴露在CDN上未受控的资源会被他人嵌入、抓取或镜像。
3. 结论:结合Referer限制、签名URL、IP/Geo限制与头部校验可形成多层防护。
2.1 准备域名与CDN控制台账号;2.2 确认源站(Storage/S3或自建Nginx)支持所需头部和时间同步(NTP);2.3 记录需保护的路径和TTL策略;2.4 备份现有CDN配置。
3.1 在CDN控制台找到“防盗链/Hotlink”设置;3.2 添加允许的Referer白名单,如example.com、*.example.com;3.3 选择是否允许空Referer(建议对API或直接访问关闭);3.4 指定响应行为:返回403或图片替代(设置自定义404/403页);3.5 测试:在浏览器地址栏直接访问、在另一个域以img标签嵌入,确认被阻止或允许。
4.1 原理:URL包含时间戳+签名(token),CDN校验签名有效期与秘钥;4.2 在CDN或源站生成签名:示例伪码 sign=HMAC_SHA256(secret, path + expiry)。
4.3 操作步骤:在控制台启用“URL鉴权/签名”,上传或配置秘钥、签名算法和有效期策略;4.4 集成:后端生成带签名的下载链接发送给用户;4.5 测试:用过期时间、篡改签名等场景验证拒绝访问。
5.1 在CDN管理页面启用“IP白名单/黑名单”和“地理位置限制”;5.2 配置策略例子:仅允许公司办公IP段访问管理资源,或阻断高风险国家访问图片上传接口;5.3 注意IPv6与代理(云端负载均衡)的X-Forwarded-For处理;5.4 测试通过:使用VPN切换国家、或从指定IP访问以验证策略。
6.1 对API或文件上传,校验自定义头部(如X-Requested-From)能有效阻止简单的跨域嵌入;6.2 在CDN/源站设置CORS,明确Access-Control-Allow-Origin,仅允许指定来源;6.3 在Nginx源站示例配置:add_header Access-Control-Allow-Origin https://example.com; 并限制Methods;6.4 测试: 用curl模拟不同Origin请求,观察是否被阻止。
7.1 签名URL带时间戳时需确保CDN不过度缓存“错误”响应;7.2 对静态资源设置合理TTL,遇到权限变更时调用CDN刷新接口(API化invalidate);7.3 建议将私有资源走不同子域名并配置短TTL以便快速撤销访问。
8.1 启用CDN访问日志并落地到日志分析平台,关注403/401/其他异常增长;8.2 建立告警(异地访问激增、大量空Referer请求等);8.3 定期演练:模拟盗链、签名失效、IP绕过场景并验证应对。
9.1 问题定位流程:先看CDN访问日志->检查CDN规则优先级->查看源站日志->网络抓包;9.2 常见误区:Referer被浏览器隐私设置或代理清空;签名时间不同步导致拒绝(检查NTP);9.3 建议:使用分层策略避免单一失效点。

10.1 将敏感内容放在专用子域并使用签名URL;10.2 对公开静态资源使用Referer防盗链,提高体验同时节省成本;10.3 使用IP/Geo作为补充控制,不作为唯一手段;10.4 建立自动化CI流程来更新和回滚CDN规则。
11. 答:如果只是防止简单嵌入与节省流量,优先用Referer规则;若需严格控制下载权限、支持临时授权或第三方分发,优先使用签名URL/Token,二者也可混合使用以提高安全性。
12. 答:签名URL带时间戳会导致URL不同而影响缓存命中。解决方式:在CDN上设置“缓存键忽略签名参数”或使用Cookie/Token校验而将签名部分不纳入缓存键;同时为静态公开资源维持无签名URL来保证高命中率。
13. 答:启用并分析CDN访客日志、设置异常告警、定期做外部穿透测试(模拟跨域嵌入和不同IP访问),并在每次策略变更后执行回归测试以确认没有误伤正常流量。