今天收到一個任務:要求破解別人網站的圖片防盜鏈。我搜尋了一下,瞭解到目前市面上的大體方法主要有:
- 替換圖片的url,然後利用代理.www.aslibra.com/blog/post/c…;
- 利用https;cnodejs.org/topic/5459d…;
- 利用js+iframe。gist.github.com/cos800/1d87…;
進一步分析,這些方案都是在利用空referrer不觸發防盜鏈機制這個特徵。個人總覺得以上的方法都有點小題大做,且改動也比較大。於是,自己翻閱了一下資料,實現了利用service worker來破解防盜鏈的方案。
service worker是什麼
這裡摘抄網上一個篇介紹,簡明扼要:
service worker 是獨立於當前頁面的一段執行在瀏覽器後臺程式裡的指令碼。
service worker不需要使用者開啟 web頁面,也不需要其他互動,非同步地執行在一個完全獨立的上下文環境,不會對主執行緒造成阻塞。基於service worker可以實現訊息推送,靜默更新以及地理圍欄等服務。
感興趣的朋友請參見:
破解防盜鏈原理
- 在頁面body前註冊servie work 的指令碼(假設指令碼在根目錄下service-work.js)。
if (navigator.serviceWorker) { navigator.serviceWorker.register('service-worker.js').then(function (registration) { console.log('service worker 註冊成功'); }).catch(function (err) { console.log('servcie worker 註冊失敗') }); }複製程式碼
- 在servie-work.js裡註冊fetch事件。然後找到需要破解的圖片域名。
var domain = "http://mmbiz.qpic.cn";//domain是需要破解有防盜鏈地址的域名。 self.addEventListener('fetch', function (e) { if (e.request.url.indexOf(domain) >= 0) { var req = e.request.clone(); var returnUrl = req.url; e.respondWith( fetch(returnUrl, { referrer: "", //通過設定referrer為空,騙過利用referrer實現防盜鏈的網站 mode: 'no-cors' }) ); } });複製程式碼
- 至此,實現破解防盜鏈。測試後,效果不錯。
弊端
- 瀏覽器相容性問題。主要是瀏覽器對service worker的相容。請參見:developer.mozilla.org/en-US/docs/…;
- 只對利用空referrer實現防盜鏈的網站有效。
- 【補充一下】需要HTTPS環境。
優點
- 簡潔,無需動態修改dom上的img src地址;
- 對dom層透明,不需要生成多餘的hack標籤。
註冊失敗的可能原因
有網友反饋註冊失敗(見評論),這裡重點摘抄出來,註明一下,希望引起大家注意。具體請參考:developer.mozilla.org/zh-CN/docs/…
1. 你沒有在 HTTPS 下執行你的程式
1. service worker檔案的地址沒有寫對— 需要相對於 origin , 而不是 app 的根目錄...
1. service worker 在不同的 origin 而不是你的app的,這是不被允許的。複製程式碼