背景
公司在做付費課程,視頻教學爲主,需要對視頻鏈接作防盜鏈處理。
REFERER
HTTP referer 是 header 上的一個屬性。當瀏覽器向服務器發起請求時,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的。
七牛在融合 CDN -> 域名管理 -> 高級配置裏有一個域名防盜鏈選項。
配置好之後就可以限制鏈接只能從配置好的白名單域名進行訪問,簡單的防禦了盜鏈。但是HTTP header 是可以被僞造的,經測試,直接用 postman 加個 Referer 就可以繞過了。
私有空間
七牛雲提供了私有空間,空間內的文件對象都要獲得擁有者的授權才能進行訪問,並且可以設置鏈接的有效時間,超過時長後自動失效(視頻會有緩存,清空緩存之前視頻仍然有效)。
如何創建私有空間的訪問鏈接,下面是 Node.js SDK 的一段示例代碼,其他語言可以去官網查看。
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var config = new qiniu.conf.Config();
var bucketManager = new qiniu.rs.BucketManager(mac, config);
var privateBucketDomain = 'http://if-pri.qiniudn.com';
var deadline = parseInt(Date.now() / 1000) + 3600; // 1小時過期
var privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, key, deadline);
注意
- 測試域名不能用於私有空間。
- 自定義域名必須開啓回源鑑權。
- 播放 hls 文件需要使用 pm3u8 服務。
詳情可見這裏:私有空間的注意事項。
PM3U8
視頻切片(七牛視頻切片)後放在私有倉庫時,獲取單段視頻的鏈接也需要帶上token。七牛提供了 pm3u8服務 ,對 m3u8文件中的 ts 資源進行批量下載授權。通過將 ts 資源的 url 改寫成私有 url,以臨時獲取訪問權限。
有個需要注意的地方是,做簽名處理時,要對整個鏈接做簽名,比如 https://test.com/12354.m3u8?pm3u8/0
。
var privateBucketDomain = 'http://if-pri.qiniudn.com';
var deadline = parseInt(Date.now() / 1000) + 3600; // 1小時過期
var key = 12354.m3u8?pm3u8/0; // pm3u8 參數和 url 一起做簽名
var privateDownloadUrl = bucketManager.privateDownloadUrl(privateBucketDomain, key, deadline);
還有個需要注意的地方是,雖然官方文檔有一句這種提示,但和七牛溝通後的結果是,pm3u8 服務也是支持 https
的。
總結
使用 REFERER + 私有空間 已經可以解決盜鏈問題了,但是如果視頻被下載仍然是個問題。需要對視頻做加密處理,但是即使做了加密處理,也阻止不了錄屏。完全杜絕視頻泄露是很難的,或者我們可以採取其他方式加大盜用的成本,比如在視頻里加上水印或者觀看者ID,甚至讓水印或者觀看者ID在視頻裏四處遊走(影響觀看體驗)。