一、概述
傳統的 IP 禁用、referer 防盜鏈、User-Agent 防盜鏈、地區訪問控制等防盜鏈措施已經無法完全滿足用戶要求,所以開發出URL參數簽名方式來防盜鏈
二、實現
Token防盜鏈是通過對時間有關的字符串進行簽名,將時間、簽名信息通過一定的方式傳遞給 web server節點服務器作為判定依據,web server節點依據約定的算法判斷來訪的 URL 是否有訪問權限。如果通過,執行下一步;如果不通過,響應 HTTP 403 狀態碼或者通過 302 跳轉到其他 URL。
1、簽名參數
etime: URL 過期的時間,必須是 UNIX TIME 格式,如:2017/3/9 9:19:0 -> 1489022340
secret: 和 平台約定的簽名密鑰,需要在 平台后端管理控制台配置,(服務-> 配置 -> 防盜鏈 -> Token 防盜鏈);
2、算法:
sign = MD5( secret & etime & URI )
Token = MD5( secret & etime & URI ){ 中間 8 位 } + etime
假設當前的 UNIX TIME 時間為:1370000000,某圖片資源(例如:http://test.example.com/dir/pic.jpg)10 分鍾有效,則:
etime = 1370000000 + 600 = 1370000600
uri = '/dir/pic.jpg'
sign = MD5( secret & etime & URI ) = xxxxxxxxxxxxabcdefghyyyyyyyyyyyy
Token = MD5( secret & etime & URI ){ 中間 8 位 } + etime = abcdefgh1370000600
最后經過客戶端業務服務器生成的 URL 為:
http://test.example.com/dir/pic.jpg?token=abcdefgh137000060
三、驗證
-
根據約定解析取出過期時間,和當前 web Server節點服務器時間進行比較,確認請求是否過期
-
根據上文約定好的算法計算方式,計算出 MD5 加密串后,和 URL 中的加密串進行比較,驗證加密串是否一致
-
如果以上兩個步驟都驗證通過,請求才會被認為是合法的,這時 web server 會請求資源響應給客戶端,否則會被認為是非法請求,直接響應 HTTP status code 403