
1.
说明:在开始前确认 CDN 支持签名 URL / Token、可以配置 Origin Pull、支持 HTTPS。后端需 PHP 7+、openssl/hash_hmac 可用,以及可保存密钥的安全方案(环境变量或 KMS)。
小分段:准备好 CDN 控制台账号、域名绑定、源站地址、以及用于签名的密钥(注意不要硬编码到代码仓库)。
2.
说明:常用策略有:短期签名 URL(推荐)、Signed Cookie(适合播放器跨资源)、Referer 限制(易被伪造,仅作补充)、CDN 内置防盗链功能与防舆情篡改校验。
小分段:优先使用 HMAC 签名 + 过期时间;HLS 场景同时签 m3u8 与 ts 段;如果使用 CloudFront/Akamai/阿里云等,启用其“URL 鉴权/防盗链”模块。
3.
说明:签名思路为对 path + expires (+ 可选 client-ip) 用共享密钥做 HMAC,然后 base64url 编码作为 sig 参数。
小分段:示例代码(请将 <?php 转义以放入 HTML):
<?php $path = '/videos/123.mp4'; $expires = time() + 300; // 5 分钟有效 $secret = getenv('CDN_SECRET'); $plain = $path . '|' . $expires; $sig = rtrim(strtr(base64_encode(hash_hmac('sha256', $plain, $secret, true)), '+/', '-_'), '='); $url = "https://cdn.example.com{$path}?expires={$expires}&sig={$sig}"; echo $url; ?>
4.
说明:在 CDN 控制台添加签名校验规则,使用与后端相同的密钥与算法,设置允许时间窗口。确保 CDN 在验证通过后仍然缓存对象以省流量。
小分段:设置 Cache-Control(例如 public, max-age=3600)和 Origin 缓存键包含 query string(或不包含,视签名实现);对于短期签名通常把 expires 与 sig 加入缓存键以避免误缓存。
5.
说明:HLS 由 playlist(m3u8) 与多个 ts 段组成,必须签名 playlist 和每段文件,或签名 playlist 并由 CDN 替换内部段地址。
小分段:方案 A:每个 ts 生成签名 URL;方案 B:使用 Signed Cookie,让播放器请求所有段时带上 cookie;方案 C:后台生成带签名的 playlist,播放器仅请求该 playlist,CDN 验证签名后允许访问。
6.
说明:为了隐藏源站真实路径,可用 PHP 做鉴权后通过 X-Accel-Redirect(Nginx)或 X-Sendfile(Apache)内部转发给受保护的文件路径,让 CDN 从受保护路径拉取。
小分段:PHP 验证签名-> header('X-Accel-Redirect: /internal/protected'.$path); exit; 并在 Nginx 配置 internal location 指向真实文件目录,避免直接外链。
7.
说明:防篡改依赖签名与短期有效,额外可加 nonce/请求计数、IP 绑定、User-Agent 白名单等增强规则,且定期轮换密钥并记录访问日志。
小分段:密钥不要长时间硬编码;使用 KMS 存放主密钥,CDN 密钥周期性替换;监控异常访问、设置速率限制并启用 HTTPS 强制加密。
8.
说明:测试时用 curl / 浏览器播放,检查 expires 与 sig 是否正确、签名校验流程、CDN 日志返回码(403/400)。
小分段:若出现 403,检查服务器时间同步(NTP)、签名算法与密钥一致性、URL 编码问题与 Base64 URL 安全字符处理。
9.
问:单纯用 Referer 限制能防盗链吗?
答:Referer 易被伪造或被浏览器策略限制,不可靠。建议将 Referer 作为辅助手段,主要依赖 HMAC 短期签名或 Signed Cookie。
10.
问:签名过期时间如何设定比较合适?
答:如果是直接播放地址,通常设为几分钟(如 2-10 分钟);若使用 Signed Cookie,可设更长(小时级)。权衡用户体验与安全,针对不同场景调整。
11.
问:CDN 缓存如何既高效又不被绕过篡改?
答:将签名作为缓存键的一部分或用短期签名 + CDN 验证,结合 Origin 校验与 HTTPS。若需更强保证,启用 CDN 的 Origin Identity(仅允许边缘与源之间的受信通信)并开启访问日志审计。