功能说明
Token 防盗链是通过对时间有关的字符串进行签名,将时间、签名信息通过一定的方式传递给 CDN 节点服务器作为判定依据,CDN 边缘节点依据约定的算法判断来访的 URL 是否有访问权限。如果通过,执行下一步;如果不通过,响应 HTTP 403 状态码或者通过 302 跳转到其他 URL。
实现原理
Token 防盗链的实现原理可参见如下图所示:
如上图所示,整个 token 防盗链的实现需要如下几个部分来配合:
1)客户端:负责发送原始请求给客户端业务服务器以及发送带签名的 URL 给 CDN 节点进行验证;
2)业务服务器:根据约定的算法生成带 _upt 参数的 URL 返回给客户端;
3)CDN 节点:负责和客户端进行时间、签名校验;
1、签名参数
<br />etime: URL 过期的时间,必须是 UNIX TIME 格式,如:2017/3/9 9:19:0 -> 1489022340
secret: 和 CDN 平台约定的签名密钥,需要在 CDN 管理控制台配置
URI:请求 URL 的路径部分(不包含 ? 及后面的 Query String),如客户端访问的外链地址为 http://xxx.b0.upaiyun.com/path/to/a.jpg?version=1.0,那么 URI 部分则为:/path/to/a.jpg
2.算法说明
sign = MD5( secret & etime & URI )
_upt = sign { 中间 8 位 }+etime
_upt = MD5( secret & etime & URI ){ 中间 8 位 } + etime
备注:其中 "&" 符号勿忘记添加
举个例子:假设当前的 UNIX TIME 时间为:1370000000,某图片资源(例如:http://test.example.com/dir/pic.jpg)10 分钟有效,则:
etime = 1370000000 + 600 = 1370000600
URI = '/dir/pic.jpg'
sign = MD5( secret & etime & URI ) = xxxxxxxxxxxxabcdefghyyyyyyyyyyyy
_upt = MD5( secret & etime & URI ){ 中间 8 位 } + etime = abcdefgh1370000600
最后经过客户端业务服务器生成的 URL 为:
http://test.example.com/dir/pic.jpg?_upt=abcdefgh1370000600
实现方式
1.客户端业务服务器生成验证信息
验证信息的生成由业务服务器负责,具体的加密过程需要确认如下事项:
- 确认过期时间的格式,默认采用 UNIX 时间戳格式
- 确认验证信息中的密文,用户计算验证信息,需要和 CDN 平台约定
- 确认验证信息时加入的参数,默认为 URL 的路径部分
- 根据上文的算法说明计算验证信息,其中请求 URL 中的验证参数为 _upt
2.又拍云 CDN 节点验证过程
- 根据约定解析取出过期时间,和当前 CDN 节点服务器时间进行比较,确认请求是否过期
- 根据上文约定好的算法计算方式,计算出 MD5 加密串后,和 URL 中的加密串进行比较,验证加密串是否一致
- 如果以上两个步骤都验证通过,请求才会被认为是合法的,这时 CDN 会请求资源响应给客户端,否则会被认为是非法请求,直接响应 HTTP status code 403
配置引导
登陆 CDN 控制台,依次进入:服务 管理 > 功能配置 > 访问控制 > Token 防盗链,点击「管理」按钮即可开始配置。如下图所示:
如上截图所示,此处填写的密钥也即与 CDN 平台约定的签名密钥。
注意事项
- 当防盗链涉及的参数(比如:密钥、过期时间)发生变更时,需要在 CDN 控制后台及时调整;
- 时间戳防盗链的相关参数是经常发生变更的,由于植入到了 URL 中,会影响到节点的缓存,可能会导致一份相同的文件,会因为 URL 里面的防盗链参数的不同而缓存多份,一般情况下,建议去忽略参数进行缓存。