基于时间戳防盗链的功能其实每家的CDN都是支持的。主要是经过使用约定的加密字符串来对具备访问有效期的资源连接进行一些加密计算的到一个sign
值,而后访问外链里面带上这个sign
和截止时间戳去访问CDN的节点,CDN的节点会用一样的算法来计算访问连接是否合法,若是不合法则返回403 Forbidden
,不然返回所要访问的资源。php
算法说明golang
基于时间戳的防盗链是经过对时间有关的字符串进行签名,将时间,签名经过必定的方式传递给CDN服务器做为断定依据,CDN边缘节点依据约定的算法判断来访的URL是否有访问权限。算法
若是经过,执行下一步;服务器
若是不经过,响应 HTTP 状态码 403。加密
若是同时配置了Referer方式防盗链,UserAgent防盗链,时间戳防盗链,那么若是有其中一项没有经过,那么即响应403。spa
签名参数code
http://if-pbl.qiniudn.com/golang.png?v=1
那么其中PATH部分就是/golang.png
签名算法blog
待签名的原始字符串 s=key+path+T
token
签名方式 sign=md5(s).to_lower()
,其中to_lower()
表示生成的md5字符串用小写字母表示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;