LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

Nginx如何實現網站圖片和文件下載的防盜鏈

admin
2025年6月29日 15:0 本文熱度 256

什么是防盜鏈?

舉個例子來說,有兩個網站,A網站想使用B網站的圖片,第一種方法是在A網站中直接添加B網站的圖片鏈接,第二種是將B網站的圖片下載回來,然后上傳到A網站中使用,此時,如果B網站不想讓A網站繼續使用此圖片了,可以通過添加一些限制來阻止A網站使用,這個阻止措施就是防盜鏈,添加了防盜鏈后,A網站再次使用通過URL請求B網站圖片的時候,就會提示錯誤信息或者其他內容,從而保護了原圖片,下面演示如何配置防盜鏈

環境準備:

域名
IP
用途
www.server1.com192.168.130.128要配置防盜鏈的服務器
www.server2.com192.168.130.130盜用服務器

1、首先配置server1服務器,讓Nginx請求一個圖片,配置如下:

在nginx根目錄下創建文件夾image,在下面放一個1.png文件,訪問www.server1.com/image/1.png,如下:

2、配置server2服務器,修改Nginx默認頁面index.html,添加server1的圖片URL,如圖:

訪問頁面,可以看到server1的圖片已經加載出來,如圖:

防盜鏈配置

Nginx中實現防盜鏈的配置主要有兩個模塊:

  • --with-http_secure_link_module:第三方模塊

  • refer模塊:Nginx自帶的


refer模塊

refer模塊原理是: 如果網站盜用了你的圖片,那么用戶在點擊或者查看這個盜鏈內容時,發送 http 請求的頭部中的 referer 字段將為該盜版網站的 url。此時我們通過獲取這個頭部信息,獲取http 發起請求的頁面,然后判斷這個地址是否是我們的合法頁面,不是則判斷為盜鏈

referer中比較重要的指令就是valid_referers,它后面可以攜帶多個參數,表示多個referer頭都是有效的,語法如下:

valid_referers none | blocked | server_names | string ...;

主要參數有:

  • none:如果header中的referer為空,也能訪問

  • blocked:header中的referer不為空,但值被防火墻或代理服務器偽裝過,比如不帶http/https協議頭的資源允許訪問

  • server_names:若 referer 中的站點域名和 server_names 中的某個域名匹配,則允許訪問

  • 最后是任意字符或者正則表達式


Nginx 會通過查看 referer 字段和 valid_referers 后面的 referer 列表進行匹配,如果匹配到了就將內置的變量$invalid_referer值設置為0,否則設置該值為1,匹配的過程不區分大小寫

1、下面在server1服務器的Nginx配置防盜鏈設置,如圖:

  • ~*:開始正則匹配,不區分大小寫

  • .表示除換行符之外的所有字符,*表示匹配0次或多次

  • (jpg|png|jpeg)$ 表示以這幾個后綴結尾


2、再次通過server2域名來請求頁面,可以看到圖片已經無法加載,如圖:

注意:可靈活使用none、blocker等參數

secure_link模塊

通過 referer 頭部值的防盜鏈方法過于脆弱,盜用者很容易通過偽造 referer 的值輕而易舉跳過防盜措施,在 Nginx 中有一種更為高級的防盜方式,即基于 secure_link 模塊,該模塊能夠檢查請求鏈接的權限以及是否過期,多用于下載服務器防盜鏈。這個模塊默認未編譯進 Nginx,需要在源碼編譯時候添加--with-http_secure_link_module即可安裝成功

該模塊的通過驗證 URL 中的哈希值的方式防盜鏈。它的防盜過程如下:

  • 由服務器或者 Nginx 生成安全的加密后的 URL, 返回給客戶端

  • 客戶端用安全的 URL 訪問 Nginx,獲取圖片等資源,由 Nginx 的 secure_link 變量判斷是否驗證通過


通過配置 secure_link, secure_link_md5 指令,可實現對鏈接進行權限以及過期檢查判斷的功能,secure_link 模塊的值有如下三種情況:

  • 空字符串: 驗證不通過

  • 0: URL 過期

  • 1: 驗證通過


通常使用這個模塊進行 URL 校驗,那么如何生成合法的URL以及在Nginx中如何配置來校驗這個URL呢?

生成合法的 URL 和 指令 secure_link_md5 有關,例如:

secure_link_md5 "$secure_link_expires$uri secret_key";

如果Nginx中的secure_link_md5 是上述配置,那么生成合法的URL命令如下:

#2023-11-06 11:23:15+過期時間,比如+300s,然后轉換為時間戳為1699240995echo -n '1699240995/1.png secret_key' | \openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

通過上述命令得到一個md5的值:YfagRTs8J-soGzU0_Whd1g,這個值很重要,接下來構造URL和指令secure_link有關,如果 secure_link 指令的配置如下:

secure_link $arg_md5,$arg_expires;

那么請求的url中必須帶上md5和expires參數才能正常訪問,例如:

http://www.server2.com/1.png?md5=YfagRTs8J-soGzU0_Whd1g&expires=1699240995

環境準備:

域名
IP用途
www.server2.com192.168.130.130配置防盜鏈的服務器

1、首先在server2服務器配置Nginx,訪問圖片路徑,如圖:

在/usr/local/nginx/image下上傳1.png,然后通過http://www.server2.com/1.png請求,如圖:

2、繼續修改server2服務器的Nginx配置,添加防盜鏈配置,如圖:

從上圖看出,我們自定義的是校驗不通過的時候返回狀態碼405,現在我們再次請求下圖片,如圖:

返回405,說明防盜鏈規則已經生效,上面已經提過,如果要實現正常請求,需要在請求參數中攜帶md5和expires參數才可以,定義md5和expires的方法如下:

(1)、定義過期時間,這里使用shell演示,如下:

date -d "+300 seconds" +%s

(2)、使用過期時間生成md5,如下:

echo -n '1699256991/1.png secret_key' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

注:secret_key需要與Nginx中配置的secret_key保持一致,否則請求不到資源

(3)、接下來使用url+md5+expires請求,即可正常訪問了,如下:

http://www.server2.com/1.png?md5=ofVmCiO53rLdoisMOfZuPA&expires=1699256991

注意:在實際使用中,過期時間和 md5是需要通過開發代碼來生成,因此,無論哪里需要請求這個資源,都需要md5和expires參數才能正常請求


閱讀原文:原文鏈接


該文章在 2025/7/1 23:19:44 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
久久亚洲日韩理论AⅤ片 | 丝袜屁股在线国产 | 日韩亚洲经典视频在线观看 | 香蕉成年网站未满十八禁 | 亚洲成在人电影天堂 | 一本大道香蕉久在线播放 |