一、原理
先說說防盜鏈的原理,http 協議中,如果從一個網頁跳到另一個網頁,http 頭字段里面會帶個 Referer。圖片服務器通過檢測 Referer 是否來自規定域名,來進行防盜鏈。
如果盜用網站是 https 的 protocol,而圖片鏈接是 http 的話,則從 https 向 http 發起的請求會因為安全性的規定,而不帶 referer,從而實現防盜鏈的繞過。
比如現在在 cnode 這里,由於我們啟用了 https,所以任何 http 的圖片幾乎都可以直接貼過來並顯示了。
官方輸出圖片的時候,判斷了來源(Referer),就是從哪個網站訪問這個圖片,如果是你的網站去加載這個圖片,那么Referer就是:你的網站地址;;你網站地址,肯定沒在官方的白名單內,所以就看不到圖片了。
因此,若不發送Referer,也就是沒有來源。那么官方那邊,就認為是從瀏覽器直接訪問的,所以就能加載正常的圖片了。
二、應對方法
1: <meta name="referrer" content="never">
html頭添加這段代碼 表示請求頭的不發送referrer
2:iframe
function showImg( url ) { var frameid = 'frameimg' + Math.random(); window.img = '<img id="img" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height = document.getElementById(\'img\').height+\'px\'; }<'+'/script>'; document.write('<iframe id="'+frameid+'" src="javascript:parent.img;" frameBorder="0" scrolling="no" width="100%"></iframe>'); }
調用方式:
showImg('圖片地址');
關於防御方法,有以下3點:
1、不允許referer為空(不建議,因在某些開啟隱私模式的瀏覽器中,或https頁面引用下,referer是空的)
2、地址變更(lighttpd的是根據有效時間,nginx的根據是md5)
3、登錄校驗(如必須登錄網站帳號后才能訪問)