107
時(shí)間(jiān)戳防盜鏈

操作(zuò)說(shuō)明

登錄,進入控制台->CDN->域名管理(lǐ)->配置->訪問控制

時(shí)間(jiān)戳防盜鏈修改配置

時(shí)間(jiān)戳防盜鏈:默認為(wèi)關(guān)閉,開啓時(shí),會同時(shí)生(shēng)成兩組可用的key,用戶需先按照文檔說(shuō)明在代碼中将Key配置進您的URL,再進行格式檢查,然後确認開啓;還可以自定義輸入KEY,支持輸入備用KEY且不能(néng)與主KEY相同;同時(shí)需要輸入檢查URL,以保證鑒權服務(wù)正常可用,以免影響服務(wù)。

算(suàn)法說(shuō)明

基于時(shí)間(jiān)戳的防盜鏈是通過對時(shí)間(jiān)有關(guān)的字符串進行簽名,将時(shí)間(jiān)、簽名通過一(yī)定的方式傳遞給 CDN 服務(wù)器(qì)作(zuò)為(wèi)判定依據,CDN 邊緣節點根據約定的算(suàn)法判斷來(lái)訪URL是否有訪問權限。

通過,執行下(xià)一(yī)步;不通過,響應 HTTP status code 403。

若同時(shí)配置了(le) Referer、UA防盜鏈、時(shí)間(jiān)戳防盜鏈,有一(yī)項不滿足條件,即為(wèi)不通過,響應 403 。

簽名參數

  • T:URL 過期時(shí)間(jiān)。按 unix_time 的 16進制小寫形式表示。 如(rú) 2015-08-01 00:00:00 –> 1438358400 –> 55bb9b80
  • key:在開啓時(shí)間(jiān)戳防盜鏈時(shí),可以由使用:(控制台->CDN->域名管理(lǐ)->訪問控制->時(shí)間(jiān)戳防盜鏈),使用其中一(yī)個(gè)即可。也(yě)可以自行使用算(suàn)法生(shēng)成。
  • path:訪問資源的 URL 中的路(lù)徑部分(fēn),例如(rú):訪問的URL為(wèi) http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1,則 path = /DIR1/dir2/vodfile.mp4(注意不含 querystring 部分(fēn))

簽名算(suàn)法

  • 簽名原始字符串 S = key + url_encode(path) + T 。斜線 / 不編碼。
  • 簽名 SIGN = md5(S).to_lower(),to_lower 指将字符串轉換為(wèi)小寫;

注:本文所提到的 url_encode 算(suàn)法。

簽名參數傳遞方式

作(zuò)為(wèi)URL查詢參數。

例如(rú)原始訪問的URL為(wèi): http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1

最終形成的訪問URL為(wèi): http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1&sign=<SIGN>&t=<T>

  • 簽名參數 sign、 t ,sign 在前,t 在後;
  • <SIGN><T> 替換為(wèi)對應的值, 實際url中不含<> ;

訪問url

訪問 url 的 path 部分(fēn)也(yě)需要 url_encode,其算(suàn)法與簽名時(shí)使用 url_encode 算(suàn)法一(yī)緻。斜線 / 不編碼。

訪問 url 為(wèi):

scheme+"://"+host+url_encode(path)+query_part

如(rú)

http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1&sign=19eb212771e87cc3d478b9f32d6c7bf9&t=55bb9b80
http://xxx.yyy.com/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp4?v=1.2&sign=6356bca0d2aecf7211003e468861f5ea&t=55bb9b80

注:

  1. 本文所提到的 url_encode 算(suàn)法,斜線 / 不編碼。
  2. 訪問 url 的 path 部分(fēn)推薦按 url_encode 編碼,如(rú)下(xià)例。
示例
例1:

URL http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1 ,假設 key = 12345678 ;過期時(shí)間(jiān)為(wèi) 2015-08-01 00:00:00 ,即 1438358400 ,也(yě)就(jiù)是 T = 55bb9b80S = 12345678/DIR1/dir2/vodfile.mp455bb9b80SIGN = 19eb212771e87cc3d478b9f32d6c7bf9 , 訪問 url 為(wèi):

http://xxx.yyy.com/DIR1/dir2/vodfile.mp4?v=1.1&sign=19eb212771e87cc3d478b9f32d6c7bf9&t=55bb9b80

之後将 url 地址填寫在上(shàng)圖中的 檢查url 處驗證。

例2:

URL http://xxx.yyy.com/DIR1/中文/vodfile.mp4?v=1.2 ,假設 key = 12345678T = 55bb9b80S = 12345678/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp455bb9b80SIGN = 6356bca0d2aecf7211003e468861f5ea ,訪問 url 為(wèi):

http://xxx.yyy.com/DIR1/%E4%B8%AD%E6%96%87/vodfile.mp4?v=1.2&sign=6356bca0d2aecf7211003e468861f5ea&t=55bb9b80

之後将 url 地址填寫在上(shàng)圖中的 檢查url 處驗證。

服務(wù)端驗證

服務(wù)端拿到原始的 url ,直接解析出 host, path, sign, t ,再簽名。

算(suàn)法: S = key + path + t,SIGN = md5(S).to_lower()

注意此處沒有 url_encode 操作(zuò)。

原始的 url 指未經 url_decoded 的内容。

以 nginx 為(wèi)例說(shuō)明:

浏覽器(qì)發出實際請求url: http://example.com/foobar/hello%20world

nginx變量 $uri: http://example.com/foobar/hello world

nginx變量 $request_uri: http://example.com/foobar/hello%20world

原始的 url 内容和 $request_uri 内容一(yī)緻。

要求驗證簽名時(shí)使用 $request_uri ,此值為(wèi)原始值,内容是正确的經過 url encode 的内容,所以 path 不用編碼。

服務(wù)端不能(néng)使用 $uri 獲取各參數,然後再調用 url_encode 來(lái)獲取待簽名的 path。path url_encode 後再 url_decode,獲得的内容與原 path 可能(néng)不一(yī)樣。

http://example.com/foobar/hello+world
http://example.com/foobar/hello%2Bworld
http://example.com/foobar/hello%2bworld

以上(shàng)三個(gè)url都是合法的訪問同一(yī)資源的鏈接。相同 key 、T,執行簽名後會有三個(gè)不同的值。 %2b url_decode 再 url_encode 可能(néng)得到 %2B,導緻簽名不一(yī)緻。

這(zhè)條幫助是否解決了(le)您的問題? 已解決 未解決

提交成功!非常感謝您的反饋,我們會繼續努力做到更好(hǎo)(hǎo)! 很抱歉未能(néng)解決您的疑問。我們已收到您的反饋意見,同時(shí)會及時(shí)作(zuò)出反饋處理(lǐ)!