基于时间戳防盗链的功能其实每家的CDN都是支持的。主要是通过使用约定的加密字符串来对具有访问有效期的资源链接进行一些加密计算的到一个sign
值,然后访问外链里面带上这个sign
和截止时间戳去访问CDN的节点,CDN的节点会用同样的算法来计算访问链接是否合法,如果不合法则返回403 Forbidden
,否则返回所要访问的资源。
算法说明
基于时间戳的防盗链是通过对时间有关的字符串进行签名,将时间,签名通过一定的方式传递给CDN服务器作为判定依据,CDN边缘节点依据约定的算法判断来访的URL是否有访问权限。
如果通过,执行下一步;
如果不通过,响应 HTTP 状态码 403。
如果同时配置了Referer方式防盗链,UserAgent防盗链,时间戳防盗链,那么如果有其中一项没有通过,那么即响应403。
签名参数
- T :URL过期的时间,把Unix以秒为单位的时间戳,用16进制的小写字母形式表示。
- key : 和CDN约定好的加密字符串
- path:访问资源外链的PATH部分,比如如果访问的外链是
http://if-pbl.qiniudn.com/golang.png?v=1
那么其中PATH部分就是/golang.png
签名算法
-
待签名的原始字符串
s=key+path+T
-
签名方式
sign=md5(s).to_lower()
,其中to_lower()
表示生成的md5字符串用小写字母表示
签名参数传递方式
例如原始访问外链是:http://if-pbl.qiniudn.com/golang.png?v=1
最终形成的访问外链是:http://if-pbl.qiniudn.com/golang.png?v=1&sign=xxxx&t=xxxx
其中xxxx
对应各自的值。
核心代码实现: (其中path可以根据自己的实际情况取出来)
<?php $path=""; $time = time()+3600; $T=dechex($time); $key="xxxx"; $S=$key.$path.$T; $token = md5($S); $sign =strtolower($token); echo $T;
echo $sign;