使用Nginx為自己的網(wǎng)站資源加上防盜鏈保護(hù)實(shí)現(xiàn)
前言
在這個流量為王的時代,掌握了流量密碼,就相當(dāng)于掌握了一切皆有可能的機(jī)遇,但是,越是流量為王,越該保持敬畏之心。
資源在獲得流量的過程中扮演著極其重要的角色,如果我們的資源沒有適當(dāng)?shù)谋Wo(hù)機(jī)制,就會造成很大的損失。為了保護(hù)資源,我們可以添加防盜鏈機(jī)制。
Nginx對實(shí)現(xiàn)靜態(tài)資源防盜鏈機(jī)制提供了很好的支持,接下來我們進(jìn)入實(shí)戰(zhàn)階段。主要分為以下兩種方式:
- Referer信息校驗(yàn)
- secure_link資源保護(hù)
Referer信息校驗(yàn)
在Nginx靜態(tài)資源防盜鏈一文中,已經(jīng)詳細(xì)介紹過實(shí)現(xiàn)方法,我們這里簡單回顧一下。
實(shí)現(xiàn)原理
當(dāng)瀏覽器向web服務(wù)器發(fā)起資源請求時,會在請求頭中帶上Referer字段,告訴服務(wù)器請求是從哪個頁面過來的,服務(wù)器根據(jù)該信息進(jìn)行校驗(yàn)并響應(yīng)。
Nginx為我們提供了ngx_http_referer_module模塊,可以獲取請求頭中Referer字段,根據(jù)字段值返回不同的響應(yīng),就可以達(dá)到如果不是從我們自己網(wǎng)站發(fā)起的請求,就直接返回403禁止訪問。
配置指令
作用域: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字段,且定義了服務(wù)器名稱和可選的URI前綴。服務(wù)器名稱的開頭或結(jié)尾可以有一個“*”。在檢查過程中,“Referer”字段中的服務(wù)器端口被忽略。例如*.example.com example.*
www.example.org/galleries/
5)正則表達(dá)式
表示請求頭中存在Referer字段,且第一個符號應(yīng)該是“~”(Nginx解析正則表達(dá)式規(guī)范)。需要注意的是,表達(dá)式將從http://或https://之后開始的文本相匹配。
6)配置示例
valid_referers none blocked server_names *.example.com test.example.* ~\.example\.com
實(shí)戰(zhàn)
除了使用valid_referers指令外,我們還需要用到一個內(nèi)置變量$invalid_referer,如果Referer請求標(biāo)頭字段值被認(rèn)為有效,則$invalid_referer的值為空字符串,否則為“1”。
# 如果獲取圖片時,不是從www.example.com頁面發(fā)起的請求,則禁止訪問。
location ~^/.*\.(png|jpg|gif|jfif) {
valid_referers www.example.com;
if ($invalid_referer){
return 403;
}
root html;
}Tips:請求頭的Referer字段信息是可以通過程序偽裝生成的,因此根據(jù)Referer信息來實(shí)現(xiàn)防盜鏈并非100%可靠,但是,它能夠限制大部分的盜鏈。
secure_link資源保護(hù)
前面我們提到,在使用Referer信息進(jìn)行校驗(yàn)的時候,該字段信息可以通過程序偽裝生成,并非100%可靠。
Nginx提供了
ngx_http_secure_link_module模塊,可以對請求的鏈接進(jìn)行真?zhèn)涡r?yàn),并限制鏈接的有效時間。
官方文檔:
https://nginx.org/en/docs/http/ngx_http_secure_link_module.html
話不多少,開整。
Tips:該模塊默認(rèn)不構(gòu)建,構(gòu)建時需要自行添加configure參數(shù)
--with-http_secure_link_module。
構(gòu)建過程,可參照Nginx基本命令&不停機(jī)版本升級一文進(jìn)行模塊添加。
實(shí)現(xiàn)原理
資源鏈接按照約定的規(guī)則生成,Nginx服務(wù)器對鏈接進(jìn)行真?zhèn)我约斑^期時間校驗(yàn)。
配置指令
ngx_http_secure_link_module模塊為我們提供了兩種校驗(yàn)?zāi)J剑?/p>
- 通過secure_link_secret指令,檢查鏈接的真實(shí)性。
- 通過secure_link與secure_link_md5指令,檢查鏈接的真實(shí)性,并限制鏈接的有效時間。
接下來看看具體配置語法吧。
secure_link_secret
secure_link_secret指令用于指定需要通過MD5算法加密的字符串,同時需要配合$secure_link內(nèi)置變量來對鏈接進(jìn)行校驗(yàn)。
作用域:location
語法:secure_link_secret word;
word:需要進(jìn)行MD5加密的字符串,例如your_secure_word。
URI格式:/prefix/hash/link,例如
/img/6b105c468b2a59681b799a7f532505e3/aa.jpg。
- prefix:為不包含/的任意字符串,這里為img。
- link:這里為aa.jpg。
- hash:這里為link與word拼接之后的值(aa.jpgyour_secure_word)進(jìn)行MD5加密后的結(jié)果。
$secure_link:內(nèi)置變量,如果鏈接通過了真實(shí)性檢查,則其值設(shè)置為從/prefix/hash/link中提取link的值(包含前面的/),否則將其設(shè)置為空字符串。
secure_link
secure_link指令定義需要從URI中取出的參數(shù),包含MD5值和鏈接的有效時間。需要與secure_link_md 指令配合使用。
作用域:http, server, location
語法:secure_link expression;
配置示例:
http://192.168.110.101/img2/test.jfif?signature=vQ5_wrXQ_oxh5c3L9bbf8g&expires=1685003128
# $arg_signature,$arg_expires意味著從URI中取出參數(shù)名為signature和expires的值 secure_link $arg_signature,$arg_expires;
secure_link_md5
secure_link_md5指令定義一個表達(dá)式,計(jì)算表達(dá)式的MD5值,與URI傳遞的MD5值進(jìn)行比較。需要配合secure_link指令和$secure_link_expires內(nèi)置變量一起使用。
Tips:URI中MD5值以base64編碼的形式傳遞。
作用域:http, server, location
語法:secure_link_md5 expression;
配置示例:
secure_link $arg_signature,$arg_expires; secure_link_md5 "$secure_link_expires$uri secret";
$secure_link_expires用于獲取secure_link中傳遞的expires的值。
secure_link與secure_link_md5指令的校驗(yàn)步驟如下:
- 如果secure_link指令從URI參數(shù)中提取的signature值與secure_link_md5指令計(jì)算出的MD5值不匹配,則將$secure_link設(shè)置為空字符串;
- 如果匹配,就校驗(yàn)鏈接的有效期,如果已過期則將$secure_link設(shè)置為"0",否則設(shè)置為"1"。
URI中的signature值可以通過以下方式獲?。?/p>
1)Ubuntu命令行執(zhí)行
echo -n '1685003128/img2/test.jfif secret' | \
openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =2)Java代碼
引入Apache的commons-codec包
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency> import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5 {
public static void main(String[] args) {
Base64.encodeBase64URLSafeString(DigestUtils.md5("1685003128/img2/test.jfif secret"));
}
}secure_link_secret校驗(yàn)?zāi)J?/h2>
配置示例:
Nginx代理服務(wù)器:192.168.110.101
server {
listen 80;
server_name localhost;
location /img {
default_type text/html;
secure_link_secret test;
if ($secure_link = ""){
return 403 "<p>You don't have permission to access the URL on this server.</p>";
}
rewrite ^ /secure$secure_link;
}
location /secure {
proxy_pass http://192.168.110.100/img/;
}
}服務(wù)端:192.168.110.100
location /img {
default_type image/jpeg;
root /home/stone;
}1)訪問
http://192.168.110.101/img/test.jfif,不滿足鏈接規(guī)則,403禁止訪問。

2)訪問
http://192.168.110.101/img/f5b20551b8d06384734de574dd7930ce/test.jfif,滿足鏈接規(guī)則。

secure_link+secure_link_md5
配置示例:
Nginx代理服務(wù)器:192.168.110.101
location /img2 {
default_type text/html;
secure_link $arg_signature,$arg_expires;
secure_link_md5 "$secure_link_expires$uri secret";
if ($secure_link = ""){
return 403 "<h1>Forbidden</h1><p>You don't have permission to access the URL on this server.</p>";
}
if ($secure_link = "0"){
return 403 "<h1>Expired</h1><p>You don't have permission to access the URL on this server.</p>";
}
proxy_pass http://192.168.110.100/img/;
}服務(wù)端:192.168.110.100
location /img {
default_type image/jpeg;
root /home/stone;
}1)訪問
http://192.168.110.101/img/test.jfif,不滿足鏈接規(guī)則,403禁止訪問。

2)訪問
http://192.168.110.101/img2/test.jfif?signature=vQ5_wrXQ_oxh5c3L9bbf8g&expires=1685003128,滿足鏈接規(guī)則,且鏈接未過期。

3)訪問
http://192.168.110.101/img2/test.jfif?signature=JY7G1brnFeEWcNShV74eNA&expires=1684398328,滿足鏈接規(guī)則,但鏈接已過期。

以上就是Nginx實(shí)現(xiàn)靜態(tài)資源防盜鏈機(jī)制的全部內(nèi)容,Nginx是多模塊化的,還有很多高級功能,我們后面繼續(xù)探索。
更多關(guān)于Nginx網(wǎng)站資源防盜鏈保護(hù)的資料請關(guān)注腳本之家其它相關(guān)文章!
- Nginx/Apache服務(wù)器SSL證書自動化部署與續(xù)期實(shí)戰(zhàn)教程
- linux使用nginx部署ssl證書,將http升級為https實(shí)現(xiàn)方式
- 阿里云ssl證書如何通過Nginx部署到服務(wù)器
- Windows環(huán)境下Nginx?服務(wù)器?SSL?證書安裝部署操作過程
- Nginx部署SSL證書的過程
- Nginx下SSL證書安裝部署步驟介紹
- Nginx配置SSL證書部署HTTPS網(wǎng)站的方法(頒發(fā)證書)
- CentOS 6.7下nginx SSL證書部署的方法
- Nginx配置防盜鏈保護(hù)靜態(tài)資源的詳細(xì)教程
- Nginx實(shí)現(xiàn)防盜鏈的多種方式
- Nginx中配置防盜鏈的方法實(shí)現(xiàn)
- nginx實(shí)現(xiàn)重寫功能和防盜鏈功能
- Nginx進(jìn)階配置實(shí)現(xiàn)SSL證書部署與資源防盜鏈實(shí)操
相關(guān)文章
WebApi部署多服務(wù)器配置Nginx負(fù)載均衡的教程
這篇文章主要介紹了WebApi部署多服務(wù)器配置Nginx負(fù)載均衡 ,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
nginx日志切割定時任務(wù)的實(shí)現(xiàn)
Nginx日志切割能有效管理日志,便于查詢、控制存儲空間、提高處理效率、方便備份與歸檔,減少數(shù)據(jù)丟失風(fēng)險,實(shí)現(xiàn)方法包括重命名日志文件、編寫定時日志腳本和設(shè)置crontab定時任務(wù)2024-11-11
在Ubuntu上配置Nginx實(shí)現(xiàn)開機(jī)自啟功能
本文主要介紹了在Ubuntu上配置Nginx實(shí)現(xiàn)開機(jī)自啟功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
nginx的簡單轉(zhuǎn)發(fā)請求之server和location配置詳解
這篇文章主要介紹了nginx的簡單轉(zhuǎn)發(fā)請求之server和location配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03

