zoukankan      html  css  js  c++  java
  • 【七牛云】时间戳防盗链鉴权php实现

    基于时间戳防盗链的功能其实每家的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

    签名算法

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

    2. 签名方式 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;
  • 相关阅读:
    apache 虚拟主机配置(根据不同的域名映射到不同网站)
    Tortoise SVN 使用笔记
    Apache 根据不同的端口 映射不同的站点
    jquery 获取当前元素的索引值
    修改ThinkPHP的验证码类
    NetBeans无法使用编码GBK安全地打开该文件
    在win2003下apache2.2无法加载php5apache2_4.dll
    我看软件工程
    PHP函数参数传递(相对于C++的值传递和引用传递)
    Notepad++ 使用正则表达式查找替换字符串
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/8169010.html
Copyright © 2011-2022 走看看