傳說中圖片防盜鏈的愛恨情仇

原理

注:這裏有個頗有趣的就是 Referrer 和 Referer 的故事了感興趣的自行去了解下javascript

咱們先來了解了解防盜鏈的原理,在 http 協議中,若是從一個頁面跳到另外一個頁面,header字段裏面會帶個 Referer。圖片服務器經過檢測 Referer 是否來自規定域名,來進行防盜鏈。php

若是盜用網站是 https 的 協議,而圖片連接是 http 的話,則從 https 向 http 發起的請求會由於安全性的規定,而不帶 referer,從而實現防盜鏈的繞過。官方輸出圖片的時候,判斷了來源(Referer),就是從哪一個網站訪問這個圖片,若是是你的網站去加載這個圖片,那麼 Referer 就是:你的網站地址;你的網址確定沒在官方的白名單內,(固然做爲可操做性極強的瀏覽器來講 referer 是徹底能夠僞造一個官方的 URL 這樣也也就也能夠饒過限制🚫)因此就看不到圖片了。html

所以,若不發送 Referer,也就是沒有來源。那麼官方那邊,就認爲是從瀏覽器直接訪問的,因此就能加載正常的圖片了。java

目的

盜鏈是指在本身的頁面上展現一些並不在本身服務器上的內容。一般的作法是經過技術手段得到它人服務器上的資源地址,繞過別人的資源展現頁面,直接在本身的頁面上向最終用戶提供此內容。比較常見的是一些小站盜用大站的資源(圖片、音樂、視頻),對於這些小站來講,經過盜鏈的方法能夠減輕本身服務器的負擔,由於真實的空間和流量均是來自別人的服務器。對大站形成的影響確實徒徒增長了服務器壓力,用戶還不是本身的😅nginx

因而乎防盜鏈就是防止這種行爲的產生,實施防盜鏈系統後,由於屏蔽了那些盜鏈的間接資源請求,從而能夠大大減輕服務器及帶寬的壓力,也正如此,愈來愈多的站點都開始實施防盜鏈技術。web


實現

nginx
location ~* \.(gif|jpg|png|bmp)$ {    
    valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.;    
    if ($invalid_referer) {        
        return 403;        
        #rewrite ^/ http://www.xxx.com/403.jpg; 
    }
}複製代碼

以上全部來至xxx.com和域名中包含googlebaidu的站點均可以訪問到當前站點的圖片,若是來源域名(白名單列表)不在這個列表中。apache

那麼$invalid_referer等於 1,在if語句中返回一個 403 給用戶,這樣用戶便會看到一個 403 的頁面,若是使用下面的rewrite,那麼盜鏈的圖片都會顯示 403.jpg。瀏覽器

apache

在根目錄下建立.htaccess 文件安全


RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !phpddt.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com.com [NC]
RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
RewriteCond %{HTTP_REFERER} !feedsky.com [NC]
RewriteRule .*\.(rar|zip)$ http://www.xxx.com/ [R,NC,L]複製代碼


這段話也可寫在Apache配置文件當中bash

.htaccess文件將影響其所在的目錄及其子目錄。你能夠將其放在根目錄或項目的子目錄

上面這段代碼也是很容易理解的:

RewriteCond %{HTTP_REFERER} !^$ [NC]複製代碼

容許空的來源,即用戶瀏覽器手動屬於則容許訪問文件。

RewriteCond %{HTTP_REFERER} !phpddt.com [NC]複製代碼

容許站點自身訪問,同理,後面還要容許百度,谷歌,和一些訂閱源訪問。

RewriteRule .*\.(rar|zip)$ http://www.xxx.com/ [R,NC,L]複製代碼

這裏能夠設置防止盜鏈的類型,若是盜鏈能夠跳轉到網站首頁,本站沒有作圖片防盜鏈,若是你作圖片防盜鏈能夠設置被盜鏈的替代圖片:

RewriteRule .*\.(gif|jpg|png)$ http://xxx.com/logo.png [R,NC,L]複製代碼

破解

😄道高一尺魔高一丈既然知道原理那麼就來看看一些經常使用的破解方案若是你有更好的記得給我留言。

1.  若是盜用圖片資源是http協議那麼盜用網址可使用 https 去請求會由於安全性的規定,而不帶 referer,從而實現防盜鏈的繞過。


2. 在 HTML 代碼的 head 中添加一句 <meta name="referrer" content="no-referrer" />

3.  <img referrer="no-referrer|origin|unsafe-url" src="{item.src}"/>

4. https://images.weserv.nl/?url=`${你的圖片地址}`

由於網址是國外的速度有點慢效果還行,目的就是返回一個不受限制的圖片,可是 GIF 格式會返回jpg也就是沒有了動畫效果。

5. 利用iframe僞造請求referer

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>');
}複製代碼


6. 前面也提到來能夠服務端僞造請求頭具體不一樣的語言自行搜索對應方案,這裏就不一一列舉了。


反破解

既然有破解就固然有經常使用的防護機制😄

1. 不容許referer爲空(不建議,因在某些開啓隱私模式的瀏覽器中,或 https 頁面引用下,referer是空的)
2. 地址變動(lighttpd的是根據有效時間,nginx的根據是md5,IP地址變化)
3. 登陸校驗(如必須登陸網站賬號後才能訪問)

如下是防止網站被鏡像,被iframe

1. 防止網站被鏡像(被惡意解析和轉發等)

現象:他人域名訪問到的是個人網站解析的 ip 地址個人

解決方法:

http.ini裏能夠這樣寫

"RewriteCond Host: !^www.web\.cn$ RewriteRule (.*) http\://www\.web\.cn$1 [I,RP]"複製代碼

.htaccess裏能夠這樣寫

「RewriteCond %{HTTP_HOST} !^www.web.cn$ [NC] RewriteRule ^(.*)$ http://www.web.cn/$1 [L,R=301]」複製代碼

代碼的意思很是簡單:訪問這個網站的域名若是不是 "www.web.cn" 就自動跳轉到 "www.web.cn" 上。這樣設置就不怕本身辛辛苦苦維護的網站被別人鏡像了。

2. 防止網址被 iframe

代碼:在頁面底部或其它公用部位加入以下代碼

<script type=」text/javascript> 
   if(window!=parent) 
  window.top.location.href = window.location.href; 
< /script>複製代碼

代碼的意思也很簡單,用js方法檢測地址欄域名是否是當前網站綁定的域名,若是不是,則跳轉到綁定的域名上來,這樣就不怕網站被別人iframe了。

原文地址: (螞蟻號) www.v5ant.com/details/YZE…
相關文章
相關標籤/搜索