nginx的valid_referers指令——防盜鏈

一、利用valid_referers指令防盜鏈:

HTTP Referer是Header的一部分,當瀏覽器向Web服務器發送請求的時候,一般會帶上Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器藉此可以獲得一些信息用於處理,

例如防止未經允許的網站盜鏈圖片、文件等。因此HTTP Referer頭信息是可以通過程序來僞裝生成的,所以通過Referer信息防盜鏈並非100%可靠,但是,它能夠限制大部分的盜鏈

情況。

該指令"valid_referers"的語法:
valid_referers [none|blocked|server_names] ...
默認值:none
使用環境:server,location
該指令會根據Referer Header頭的內容分配一個值爲0或1給變量$invalid_referer。如果Referer Header頭不符合valid_referers指令設置的有效Referer,變量$invalid_referer

將被設置爲1.
該指令的參數可以爲下面的內容:
none:表示無Referer值的情況。
blocked:表示Referer值被防火牆進行僞裝。
server_names:表示一個或多個主機名稱。從Nginx 0.5.33版本開始,server_names中可以使用通配符"*"號。

 

二、配置處理:

所用到的機器:
192.168.100.100 nginx
自己的pc機  xp


測試一、我打算用個rewrite來匹配相應的url。

nginx的配置如下:

 server {          listen 80;          server_name haha.baidu.com;          root /data/www/haha;
        location /FF/ {        valid_referers www.baidu.com;        if ($invalid_referer) {          return 403;        }        }
     }
    server {          listen 80;          server_name hehe.baidu.com;          root /data1/web/hehe/FF/F4;          rewrite /hehe.html  http://haha.baidu.com/FF/F4/haha.html;
        }

log如下所示:

IP - - [07/Mar/2012:09:32:00 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"hehe.baidu.com" "-"
IP - - [07/Mar/2012:09:32:00 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"haha.baidu.com" "-"

測試:在瀏覽器中輸入http://hehe.baidu.com/hehe.html,瀏覽器其實403錯誤。

 


把 valid_referers www.baidu.com;中的www換成hehe,發現返回的也是403
log如下所示:


IP - - [07/Mar/2012:09:33:22 +0800] "GET /hehe.html HTTP/1.1" 302 161 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2"

"-" "hehe.baidu.com" "-"
IP- - [07/Mar/2012:09:33:22 +0800] "GET /FF/F4/haha.html HTTP/1.1" 403 142 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101

Firefox/10.0.2" "-" "haha.baidu.com" "-"

發現"$http_referer"的值爲"-"也就是空。

 


總結:上面的問題是發現"$http_referer"的值爲"-"也就是空,沒有滿足匹配的條件。如果我們加上none參數的話就可以了,我們讓none也就是$http_referer"的值爲"-"爲有效值(已經測試)

 

 

測試二:
爲了讓"$http_referer"能拿到以server_name爲hehe.baidu.com,我編輯了一下hehe.html,具體的內容如下所示:
html>

http://100.10.15.180:80;

        location /FF/ {
        valid_referers none blocked www.baidu.com;
        if ($invalid_referer) {
          return 403;
        }
        }

 


     }

    server {
          listen 80;
          server_name hehe.baidu.com;
          root /data/www/hehe/FF/F4;


        }


對應的log:如下所示:
IP - - [06/Mar/2012:17:24:37 +0800] "GET /hehe.html HTTP/1.1" 200 99 "-" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" "-"

"hehe.baidu.com" "-"
IP - - [06/Mar/2012:17:24:39 +0800] "GET /FF/F4/haha.html HTTP/1.1" 200 5 "http://hehe.baidu.com/hehe.html" "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2)

Gecko/20100101 Firefox/10.0.2" "-" "haha.baidu.com" "-"

測試:http://hehe.baidu.com/hehe.html,接着再點擊hehe,之後發現是403.

把www換成hehe。

接着測試:輸入http://hehe.baidu.com/hehe.html,接着再點擊hehe,之後發現是正常的內容。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章