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;
  • 相关阅读:
    maven
    in 和 or 的效率问题
    mac 安装homobrew 报错解决
    卷积的本质及物理意义
    java 多线程 day18 ThreadPoolExecutor
    打jar包
    科三保佑贴
    【问题解决】-《java.lang.NoClassDefFoundException》
    POS-商户手续费-从生活剖析,通俗易懂
    关于荒废空闲时光的思考
  • 原文地址:https://www.cnblogs.com/richerdyoung/p/8169010.html
Copyright © 2011-2022 走看看