基於時間戳防盜鏈的功能其實每家的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;