1、原理javascript
先說說防盜鏈的原理,http 協議中,若是從一個網頁跳到另外一個網頁,http 頭字段裏面會帶個 Referer。圖片服務器經過檢測 Referer 是否來自規定域名,來進行防盜鏈。css
若是盜用網站是 https 的 protocol,而圖片連接是 http 的話,則從 https 向 http 發起的請求會由於安全性的規定,而不帶 referer,從而實現防盜鏈的繞過。java
好比如今在 cnode 這裏,因爲咱們啓用了 https,因此任何 http 的圖片幾乎均可以直接貼過來並顯示了。node
官方輸出圖片的時候,判斷了來源(Referer),就是從哪一個網站訪問這個圖片,若是是你的網站去加載這個圖片,那麼Referer就是:你的網站地址;;你網站地址,確定沒在官方的白名單內,因此就看不到圖片了。nginx
所以,若不發送Referer,也就是沒有來源。那麼官方那邊,就認爲是從瀏覽器直接訪問的,因此就能加載正常的圖片了。瀏覽器
2、應對方法安全
破解盜鏈服務器
實現代碼:dom
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點:
一、不容許referer爲空(不建議,因在某些開啓隱私模式的瀏覽器中,或https頁面引用下,referer是空的)
二、地址變動(lighttpd的是根據有效時間,nginx的根據是md5)
三、登陸校驗(如必須登陸網站賬號後才能訪問)