技术分享:什么是CDN鉴权(by光网烈火)
互聯網繁榮昌盛的今天,離不開核心技術團隊的支持。就拿防止非法盜鏈來說吧,如果任意來源請求都可以盜鏈自己服務器的資源,那么將會降低企業的行業競爭力,還會導致企業為額外的非法流量買單。就此問題,光網烈火科技部上線了內部的資源鑒權服務器,可有效防止非法用戶盜鏈光網資源,用戶可查看演示地址,這種方法不僅適用于壓縮包文件下載保護,也適用于音頻、視頻的有效保護,相比以前的referer防盜技術,此方法更為有效。
那么,什么是資源鑒權呢?鑒權功能用于保護用戶站點資源不被非法下載盜用,并減少帶寬資源的浪費,用于當其他防盜鏈方式(例如:IP禁用、referer 防盜鏈、UA 防盜鏈等)無法滿足資源保護的高實時性及高安全性要求時的使用場景,所以它是一種更為安全可靠防盜方法。
目前阿里也在自己的CDN節點,部署了CDN鑒權功能。在接收到終端用戶請求時,都需要去客戶的鑒權服務器進行驗證,驗證通過之后才認為是合法請求,否則就會鑒權不通過,直接拒絕訪問。從而實現有效保護用戶站點資源。這里我們需要一臺屬于自己的鑒權服務器。由CDN客戶站點提供給用戶加密 URL (包含權限驗證信息),用戶使用加密后的 URL 向加速節點發起請求,加速節點對加密 URL 中的權限信息進行驗證以判斷請求的合法性,對合法請求給予正常響應,拒絕非法請求,從而有效保護CDN客戶站點資源。
實戰部署
下面,就發布出阿里CDN鑒權服務器中,需要部署的PHP代碼片段給大家:
鑒權方式A
//http://DomainName/Filename?auth_key=timestamp-rand-uid-md5hash
//sstring = "URI-Timestamp-rand-uid-PrivateKey" (URI是用戶的請求對象相對地址, 如 /Filename)
//HashValue = md5sum(sstring)
function PrivateKeyA(){
? ? ? ? ? ? ? ? ? $time=strtotime("+8 hours");
? ? ? ? ? ? ? ? ? $key="private.key";
? ? ? ? ? ? ? ? ? $domain="https://www.lighttp.com";
? ? ? ? ? ? ? ? ? $filename="/download/stream.mp4";
? ? ? ? ? ? ? ? ? //$sstring = "URI-Timestamp-rand-uid-PrivateKey"
? ? ? ? ? ? ? ? ? $sstring = $filename."-".$time."-0-0-".$key;
? ? ? ? ? ? ? ? ? $md5=md5($sstring);
? ? ? ? ? ? ? ? ? $auth_key="auth_key=".$time."-0-0-".$md5;
? ? ? ? ? ? ? ? ? $url=$domain.$filename."?".$auth_key;
? ? ? ? ? ? ? ? ? echo $url."\n";
}
鑒權方式B
//http://DomainName/timestamp/md5hash/FileName
//timestamp:用戶訪問時客戶源服務器的時間,作為URL的一部分,同時作為計算 md5hash 的一個因子,格式為:YYYYMMDDHHMM ,有效時間1800s
//md5hash:以timestamp、FileName和預先設定好的 PrivateKey 共同做MD5獲得的字符串,即 md5(PrivateKey + timestamp + FileName)
function PrivateKeyB(){
? ? ? ? ? ? ? ? ? $time=date("YmdHi");
? ? ? ? ? ? ? ? ? $key="private.key";
? ? ? ? ? ? ? ? ? $domain="https://www.lighttp.com/";
? ? ? ? ? ? ? ? ? $filename="/download/stream.mp4";
? ? ? ? ? ? ? ? ? //$sstring = "PrivateKeytimestampFileName"
? ? ? ? ? ? ? ? ? $sstring = $key.$time.$filename;
? ? ? ? ? ? ? ? ? $md5=md5($sstring);
? ? ? ? ? ? ? ? ? $url=$domain.$time."/".$md5.$filename;
? ? ? ? ? ? ? ? ? echo $url."\n";
}
鑒權方式C
//http://DomainName/{/}/FileName
//md5hash = md5sum()
//time: 用戶訪問源服務器時間,取 UNIX 時間,以十六進制數字字符表示。
function PrivateKeyC(){
? ? ? ? ? ? ? ? ? $time2=dechex(time());
? ? ? ? ? ? ? ? ? $key="private.key";
? ? ? ? ? ? ? ? ? $domain="https://www.lighttp.com/";
? ? ? ? ? ? ? ? ? $filename="/download/stream.mp4";
? ? ? ? ? ? ? ? ? //$sstring=PrivateKeyFileNametime
? ? ? ? ? ? ? ? ? $sstring=$key.$filename.$time2;
? ? ? ? ? ? ? ? ? $md5=md5($sstring);
? ? ? ? ? ? ? ? ? $url=$domain.$md5."/".$time2.$filename; ?
? ? ? ? ? ? ? ? ? echo $url."\n";
}
注意事項
1.使用回源鑒權功能,每次請求都要鑒權,訪問量大時,需考慮鑒權服務器的壓力;
2.合法請求時,鑒權服務器需要響應合法的鑒權狀態碼或響應體,否則會鑒權失敗;
3.可根據域名設置匹配規則添加多條鑒權配置;
4.匹配時依據序號由低到高開始逐條匹配,使用最早匹配上的規則配置進行鑒權。
鑒權錯誤都是返回 403
Md5計算類錯誤:
X-Lighttp-Com-Error:denied by req auth: invalid md5hash=de7bfdc915ced05e17380a149bd760be
時間類報錯:
X-Lighttp-Com-Error:denied by req auth: expired timestamp=1439469547
總結
以上是生活随笔為你收集整理的技术分享:什么是CDN鉴权(by光网烈火)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 聊聊HTTPS和SSL/TLS协议
- 下一篇: HTTP basic auth