【七牛云】时间戳防盗链鉴权php实现

基于时间戳防盗链的功能其实每家的CDN都是支持的。主要是经过使用约定的加密字符串来对具备访问有效期的资源连接进行一些加密计算的到一个sign值,而后访问外链里面带上这个sign和截止时间戳去访问CDN的节点,CDN的节点会用一样的算法来计算访问连接是否合法,若是不合法则返回403 Forbidden,不然返回所要访问的资源。php

算法说明golang

基于时间戳的防盗链是经过对时间有关的字符串进行签名,将时间,签名经过必定的方式传递给CDN服务器做为断定依据,CDN边缘节点依据约定的算法判断来访的URL是否有访问权限。算法

若是经过,执行下一步;服务器

若是不经过,响应 HTTP 状态码 403。加密

若是同时配置了Referer方式防盗链,UserAgent防盗链,时间戳防盗链,那么若是有其中一项没有经过,那么即响应403。spa

签名参数code

  • T :URL过时的时间,把Unix以秒为单位的时间戳,用16进制的小写字母形式表示。
  • key : 和CDN约定好的加密字符串
  • path:访问资源外链的PATH部分,好比若是访问的外链是http://if-pbl.qiniudn.com/golang.png?v=1那么其中PATH部分就是/golang.png

 

签名算法blog

  1. 待签名的原始字符串 s=key+path+Ttoken

  2. 签名方式 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;
相关文章
相关标签/搜索