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

PromiseAll發表於2019-04-17

原理

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

我們先來了解了解防盜鏈的原理,在 http 協議中,如果從一個頁面跳到另一個頁面,header欄位裡面會帶個 Referer。圖片伺服器通過檢測 Referer 是否來自規定域名,來進行防盜鏈。

如果盜用網站是 https 的 協議,而圖片連結是 http 的話,則從 https 向 http 發起的請求會因為安全性的規定,而不帶 referer,從而實現防盜鏈的繞過。官方輸出圖片的時候,判斷了來源(Referer),就是從哪個網站訪問這個圖片,如果是你的網站去載入這個圖片,那麼 Referer 就是:你的網站地址;你的網址肯定沒在官方的白名單內,(當然作為可操作性極強的瀏覽器來說 referer 是完全可以偽造一個官方的 URL 這樣也也就也可以饒過限制?)所以就看不到圖片了。

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

目的

盜鏈是指在自己的頁面上展示一些並不在自己伺服器上的內容。通常的做法是通過技術手段獲得它人伺服器上的資源地址,繞過別人的資源展示頁面,直接在自己的頁面上向終端使用者提供此內容。比較常見的是一些小站盜用大站的資源(圖片、音樂、視訊),對於這些小站來說,通過盜鏈的方法可以減輕自己伺服器的負擔,因為真實的空間和流量均是來自別人的伺服器。對大站造成的影響確實徒徒增加了伺服器壓力,使用者還不是自己的?

於是乎防盜鏈就是防止這種行為的產生,實施防盜鏈系統後,因為遮蔽了那些盜鏈的間接資源請求,從而可以大大減輕伺服器及頻寬的壓力,也正如此,越來越多的站點都開始實施防盜鏈技術。


實現

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的站點都可以訪問到當前站點的圖片,如果來源域名(白名單列表)不在這個列表中。

那麼$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配置檔案當中

.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…



相關文章