天天看點

Nginx靜态資源防盜鍊

作者:Java狂人

1.什麼是資源盜鍊

簡單地說,就是将别人的資源用到自己的頁面展示給使用者。

2.效果示範

1)準備圖檔

這兩張圖檔直接在浏覽器中通路都是可以打開的。

github圖檔位址:https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp

豆瓣圖檔位址:https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp

2)html準備

cd /usr/local/nginx/html
touch test.html           

test.html

<!DOCTYPE html>
<html>
    <body>
        <img src="https://github.githubassets.com/images/modules/site/home-campaign/hero-drone.webp"/>
        <br/ >
        <img src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2889598060.webp" alt="douban">
    </body>
</html>           

展示效果:通路http://192.168.110.98/test.html

Nginx靜态資源防盜鍊

檢視控制台:

Nginx靜态資源防盜鍊
說明douban的圖檔資源做了防盜鍊處理。

那麼我們自己的資源如何做防盜鍊處理呢?

3.資源防盜鍊

關于資源防盜鍊,我們需要先了解一個概念,那就是請求頭中的Referer字段資訊,當浏覽器向web伺服器發送請求的時候,一般會帶上Referer,告訴伺服器我是從那個頁面過來的,web伺服器根據這個資訊進行一些處理,資源防盜鍊的處理也是根據該字段資訊進行相應處理。

Tips:請求頭的Referer字段資訊是可以通過程式僞裝生成的,是以根據Referer資訊來實作防盜鍊并非100%可靠,但是,它能夠限制大部分的盜鍊。

1)準備資源

test.jfif圖檔:

Nginx靜态資源防盜鍊

2)将資源放到nginx伺服器的/usr/local/nginx/html檔案夾

3)準備test.html頁面

<!DOCTYPE html>
<html>
    <body>
        <img src="./test.jfif" alt="test">
    </body>
</html>           

4)通路頁面:http://192.168.110.98/test.html

Nginx靜态資源防盜鍊

可以看到,目前的我們的資源是可以正常通路的,接下來,我們将做一些防盜鍊的措施。

我們知道web伺服器是根據請求頭的Referer字段值來判斷請求是從哪個頁面發送過來的,nginx提供了ngx_http_referer_module子產品,來對該資訊進行處理。

下面我們來看看相關文法:

作用域:server, location

文法:valid_referers none | blocked | server_names | string ...;

1)valid_referers none;

表示請求頭中不存在Referer字段。

2)valid_referers blocked;

表示請求頭中存在Referer字段,且其值不以http://或https://開頭

3)valid_referers server_names;

表示請求頭中存在Referer字段,且其值包含nginx配置檔案中server_name的其中一個

4)任意字元串

表示請求頭中存在Referer字段,且定義了伺服器名稱和可選的URI字首。伺服器名稱的開頭或結尾可以有一個“*”。在檢查過程中,“Referer”字段中的伺服器端口被忽略;

5)正規表達式

表示請求頭中存在Referer字段,且第一個符号應該是“~”。需要注意的是,表達式将從http://或https://之後開始的文本相比對。

示例:

valid_referers none blocked server_names *.example.com test.example.* ~\.example\.com           

除了使用valid_referers指令外,我們還需要用到一個變量$invalid_referer,如果“Referer”請求标頭字段值被認為有效,則為空字元串,否則為“1”。

5)配置資源防盜鍊

因為我們現在要通路test.gfif圖檔,是以我們如下配置:

location ~^/.*\.(png|jpg|gif|jfif) {
    valid_referers www.example.com;
    if ($invalid_referer){
        return 403;
    }
    root   html;
}           

Tips:正規表達式必須以~開頭。

這個時候我們再來通路http://192.168.110.98/test.html,顯示無法通路。

Nginx靜态資源防盜鍊

我們檢視其請求頭的Referer字段:Referer:http://192.168.110.98/test.html,是以被拒絕通路了。

Nginx靜态資源防盜鍊

以上就是Nginx配置靜态資源防盜鍊,Nginx是多子產品化的,還有很多進階功能,我們後面繼續探索。

繼續閱讀