防盜鏈原理

昨天去參加一個面試,面試官上來就問「知道防盜鏈嗎?它是怎麼實現的?」。當時馬上傻了,防盜鏈是什麼東東?php

百度百科對防盜鏈的定義是html

此內容不在本身服務器上,而經過技術手段,繞過別人放廣告有利益的最終頁,直接在本身的有廣告有利益的頁面上向最終用戶提供此內容。 經常是一些名不見經傳的小網站來盜取一些有實力的大網站的地址(好比一些音樂、圖片、軟件的下載地址)而後放置在本身的網站中,經過這種方法盜取大網站的空間和流量。nginx

這段話理解起來很生澀,舉個例子:有時候咱們從一個網站,好比騰訊,轉載了一篇文章到本身的博客或空間,發現一些圖片顯示不了,這就是防盜鏈在起做用。圖片是放在騰訊的服務器上的,騰訊拒絕其它網站的頁面訪問該資源。面試

通常狀況下,當咱們瀏覽一個網頁時,並非一次請求就會把整個頁面的內容傳到本地瀏覽器,尤爲是當這個頁面帶有圖片或者其它資源。第一次請求會傳回該頁面的HTML文本,瀏覽器解析該文本發現還有圖片,會發送第二次請求,請求得到圖片。盜鏈問題是:若是一個網站沒有頁面中所說的資源,它就會把這個圖片連接到別的網站,這樣沒有任何資源的網站利用了別的網站的資源來展現給瀏覽者,提升了本身的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站爲了避免增長成本而擴充本身站點內容,常常盜用其餘網站的連接。一方面損害了原網站的合法利益,另外一方面又加劇了服務器的負擔。瀏覽器

要實現防盜鏈,咱們就必須先理解盜鏈的實現原理,提到防盜鏈的實現原理就不得不從HTTP協議提及,在HTTP協議中,有一個表頭字段叫referer,採用URL的格式來表示從哪兒連接到當前的網頁或文件。換句話說,經過referer,網站能夠檢測目標網頁訪問的來源網頁,若是是資源文件,則能夠跟蹤到顯示它的網頁地址。有了referer跟蹤來源就好辦了,這時就能夠經過技術手段來進行處理,一旦檢測到來源不是本站即進行阻止或者返回指定的頁面。服務器

Nginx防盜鏈的配置網站

  一、nginx針對文件類型的防盜鏈配置方法:spa

  location ~* \.(gif|jpg|png|swf|flv|bmp)$ {代理

  valid_referers none blocked *.php100.com php100.com;server

  if ($invalid_referer) {

  #rewrite ^/ http://www.php100.com/403.html;

  return 403;

  }

  }

  這種方法是在server或者location段中加入:valid_referers none blocked,其中none表示空的來路,也就是直接訪問,好比直接在瀏覽器打開一個文件,blocked表示被防火牆標記過的來路,*.php100.com表示全部子域名。

  二、nginx針對文件目錄的防盜鏈配置方法:

  location /img/ {

  root /data/img/;

  valid_referers none blocked *.php100.com php100.com;

  if ($invalid_referer) {

  rewrite ^/ http://www.php100.com/error.gif;

  #return 403;

  }

  }

  Apache防盜鏈的配置

  Apache 防盜鏈的第一種實現方法,能夠用 Rewrite 實現。首先要確認 Apache 的 rewrite module 可用:可以控制 Apache httpd.conf 文件的,打開 httpd.conf,確保有這麼一行配置:

  LoadModule rewrite_module modules/mod_rewrite.so

  而後在相應虛擬主機配置的地方,加入下列代碼:

  ServerName www.php100.com

  # 防盜鏈配置 參數

  RewriteEngine On

  RewriteCond %{HTTP_REFERER} !^http://php100.com/.*$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://php100.com$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://www.php100.com/.*$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://www.php100.com$ [NC]

  RewriteRule .*\.(gif|jpg|swf)$ http://www.php100.com/img/nolink.gif [R,NC]

  php100.com/www.php100.com 表示本身的信任站點。gif|jpg|swf 表示要保護文件的擴展名(以|分開)。nolink.gif 盜鏈後的重定向頁面/圖片。用以輸出警示信息,這張圖片應該儘量的小。

  有些用戶使用的是虛擬主機,沒有服務器的控制權,沒法修改 httpd.conf 文件和重啓服務器。那麼請確認你的虛擬主機支持 .htaccess,將上面的配置寫入 .htaccess 文件,放入根目錄或圖片所在的目錄便可:

  # 防盜鏈配置

  RewriteEngine On

  RewriteCond %{HTTP_REFERER} !^http://php100.com/.*$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://php100.com$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://www.php100.com/.*$ [NC]

  RewriteCond %{HTTP_REFERER} !^http://www.php100.com$ [NC]

  RewriteRule .*\.(gif|jpg|swf)$ http://www.php100.com/img/nolink.gif [R,NC]

  經過判斷referer變量的值,判斷圖片或資源的引用是否合法,只有在設定範圍內的 referer,才能訪問指定的資源,從而實現了防盜鏈(Anti-Leech)的目的。須要指出的是:不是全部的用戶代理(瀏覽器)都會設置 referer 變量,並且有的還能夠手工修改 referer,也就是說,referer 是能夠被僞造的。本文所講的,只是一種簡單的防禦手段。固然,應付通常的盜鏈也足夠了。

相關文章
相關標籤/搜索