<bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>

    Loading

    一文搞定防盜鏈設計

    大家好,我是藍胖子,在涉及到圖片或者視頻鏈接時,通常都會提到防盜鏈,這一節我將會從防盜鏈的含義到落地,向大家展示如何設計資源的防盜鏈。

    防盜鏈的含義與作用

    防盜鏈,顧名思義,是為了防止資源被他人竊取而設計的。

    通常我們將圖片或視頻鏈接存儲到obs對象存儲上,前端通過服務端返回的圖片或視頻鏈接訪問obs上對應的資源,那如果這個鏈接被第三方網站獲取到,便能在其網站上直接訪問我們的視頻或者圖片資源。

    防盜鏈的出現就是為了杜絕第三方網站能直接訪問我們的視頻或圖片資源。讓返回的資源鏈接只能被我們指定的網站進行訪問。

    防盜鏈方案設計

    接著,我以華為云的obs系統 為例, 講幾個關于防盜鏈的設計方案,供大家參考,

    refer指定黑白名單

    瀏覽器在加載靜態資源時,會在請求頭中加上Refer字段,其值為瀏覽器當前的網址,目的是為了告訴服務器,用戶在訪問資源之前的位置。

    如果第三方網站獲盜取到了我們的視頻資源,那么在其訪問時,Refer就是第三方網站的網址,我們可以在obs上配置reder黑白名單,指定資源讓某些網站不允許訪問或者對某些網站允許訪問。

    Pasted image 20240401163901.png

    更加靈活的鑒權方式-遠程鑒權

    除此以外,還有種更加靈活的鑒權方式,通過自定義的代碼來判斷該訪問鏈接是否允許被訪問。在使用obs系統時,為了減少帶寬成本,我們將會在obs前面,部署cdn節點,讓用戶訪問的資源能夠被緩存到離他比較近的cdn節點上。

    通常cdn節點上可以配置對應的訪問,例如華為云可以配置遠程鑒權的地址,指向自己的服務器鑒權接口,在接口中定義對資源的訪問權限,像cloudflare則是可以創建worker,在worker中定義鏈接的訪問權限。

    Pasted image 20240401164545.png

    鑒權邏輯應該如何寫,這里我提供一個比較通用的邏輯,給大家參考下。

    在服務端返回給客戶端資源在obs上的訪問鏈接時,可以加上該鏈接的創建時間,在鑒權邏輯里申明一個鏈接的有效期,根據鏈接的產生時間和有效期 允許該鏈接在有效期內允許訪問,比如返回給客戶端的鏈接是

    https://xxx?ctime=1711962048
    

    ctime 則是鏈接的創建時間,但是僅僅這樣是不夠的,第三方網站可以獲取到鏈接后修改ctime字段來修改鏈接的創建時間,所以我們還需要一個消息認證的機制,保證鏈接是服務器返回的且沒有經過篡改,這里可以用消息認證算法實現。

    拿消息認證算法hmac舉例,服務器端定義一個只有自己知道的密鑰,用該密鑰對資源地址進行md5的摘要計算,如下是golang中的hamc的使用邏輯,

    key := "hamcsecrete"
        data := "https://xxx?ctime=1711962048"
        hmac := hmac.New(md5.New, []byte(key))
        hmac.Write([]byte(data))
        fmt.Println(hex.EncodeToString(hmac.Sum([]byte(""))))
    

    得到的消息認證碼,加入到資源鏈接的參數中,如下,

    https://xxx?ctime=1711962048&token=679f5d6f7d344dba1e33938ae1d41ab4
    

    這樣,鑒權服務器在得到資源鏈接時,就會將資源地址通過同樣的消息認證算法和密鑰計算token值,如果計算出的token值和資源鏈接中的token值一致,則繼續查看鏈接是否在有效期范圍內,在則允許訪問,否則不允許訪問。因為消息認證的密鑰只有服務器知道,即使第三方網站獲取到了鏈接,也無法得出正確的token值。

    最后,在使用此邏輯的時候,要注意cdn服務器回源的條件,通常cdn是根據url路徑查看是否需要回源,如果url地址不同,則會去訪問源站服務器,我們當然不希望因為鏈接ctime的不同就再次去請求源站服務器,所以,在cdn節點處,需要配置,判斷回源時需要忽略ctime和token的參數。

    posted @ 2024-04-02 10:12  藍胖子的編程夢  閱讀(811)  評論(1編輯  收藏  舉報
    免费视频精品一区二区_日韩一区二区三区精品_aaa在线观看免费完整版_世界一级真人片
    <bdo id="4g88a"><xmp id="4g88a">
  • <legend id="4g88a"><code id="4g88a"></code></legend>