防盜鏈簡述
防盜鏈是一種保護網絡資源所有者權益的技術手段,旨在防止未經授權的用戶或網站通過直接鏈接的方式盜用資源,以下是關于防盜鏈的簡述:
原理
- 基于請求頭驗證:服務器通過檢查請求頭中的特定字段,如
Referer
字段,來判斷請求是否來自合法的來源。如果Referer
的值表明請求是從授權的域名發起的,服務器就允許訪問資源;否則,服務器可以拒絕提供資源或返回錯誤信息。 - 加密與簽名:對資源的鏈接進行加密或添加簽名,使合法的請求能夠正確解析和訪問資源,而非法盜鏈的請求由于無法獲取正確的加密信息或簽名,無法正常訪問。例如,生成包含資源路徑、訪問時間等信息的簽名,服務器驗證簽名的有效性來確定請求是否合法。
常用方法
- 設置
Referer
檢查:服務器端配置允許訪問的域名列表,只有當Referer
頭中的域名在列表中時,才允許訪問資源。如在 Nginx 中,可通過valid_referers
指令配置合法的Referer
來源。 - 使用 Token 驗證:為每個合法的資源請求生成一個唯一的令牌(Token),客戶端在請求資源時需要攜帶該令牌。服務器驗證令牌的有效性,以確定是否允許訪問。這種方法通常用于更嚴格的訪問控制場景,如 API 接口的防盜鏈。
- IP 限制:根據客戶端的 IP 地址來限制對資源的訪問。服務器可以配置允許訪問的 IP 地址范圍,只有來自這些 IP 地址的請求才能訪問資源。但 IP 限制可能存在局限性,因為 IP 地址可能被偽造或動態分配。
作用
- 保護資源所有者權益:防止他人未經授權使用資源,避免因盜鏈導致的帶寬浪費、存儲成本增加以及潛在的商業利益損失。例如,視頻網站的視頻資源若被大量盜鏈,會導致網站自身用戶體驗下降,同時影響廣告收入等商業利益。
- 維護網站性能和穩定性:減少因非法盜鏈帶來的額外負載,確保服務器能夠穩定地為合法用戶提供服務。如果大量盜鏈請求占用了服務器帶寬和資源,可能會導致網站運行緩慢甚至崩潰,影響正常用戶的訪問。
防盜鏈配置方法
防盜鏈的配置方法有多種,以下是一些常見服務器環境下的防盜鏈配置示例:
Nginx 服務器
- 基于 Referer 驗證
- 首先在 Nginx 配置文件中,找到對應的
server
塊或location
塊,添加valid_referers
指令來指定合法的 Referer 來源。例如:
- 首先在 Nginx 配置文件中,找到對應的
nginx
server {listen 80;server_name example.com;location / {valid_referers none blocked example.com *.example.com;if ($invalid_referer) {return 403;}}
}
-
上述配置中,
valid_referers
指定了允許的 Referer 來源,包括空 Referer、被截斷的 Referer 以及來自example.com
及其子域名的 Referer。如果Referer
不合法,if
條件判斷會返回403 Forbidden
錯誤。 -
使用加密鏈接
- 可以使用第三方模塊如
ngx_http_auth_request_module
來實現加密鏈接防盜鏈。首先需要安裝該模塊,然后配置如下:
- 可以使用第三方模塊如
nginx
server {listen 80;server_name example.com;location /protected_resource {auth_request /auth;# 其他配置}location /auth {internal;# 這里可以配置與認證服務器的交互邏輯,例如驗證加密令牌等# 假設使用Lua腳本進行令牌驗證content_by_lua_block {local token = ngx.var.http_tokenif token == "valid_token" thenngx.status = ngx.HTTP_OKngx.exit(ngx.HTTP_OK)elsengx.status = ngx.HTTP_FORBIDDENngx.exit(ngx.HTTP_FORBIDDEN)end}}
}
- 上述配置中,
/protected_resource
是需要保護的資源路徑,通過auth_request
指令將請求轉發到/auth
進行認證。在/auth
?location 中,使用 Lua 腳本驗證請求頭中攜帶的加密令牌token
,如果令牌有效則返回200 OK
,允許訪問資源,否則返回403 Forbidden
。
Apache 服務器
- 基于 Referer 驗證
- 在 Apache 的配置文件(通常是
httpd.conf
或相關的虛擬主機配置文件)中,使用mod_rewrite
模塊來實現基于 Referer 的防盜鏈。例如:
- 在 Apache 的配置文件(通常是
apache
<VirtualHost *:80>ServerName example.com<Directory /var/www/html>RewriteEngine On# 允許來自example.com及其子域名的RefererRewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]# 對于不合法的Referer,返回403錯誤RewriteRule .* - [F]</Directory>
</VirtualHost>
-
上述配置中,
RewriteEngine On
開啟了重寫引擎,RewriteCond
指令設置了兩個條件,第一個條件允許來自example.com
及其子域名的 Referer,第二個條件排除了特定的不允許的路徑。如果 Referer 不滿足條件,RewriteRule
會返回403 Forbidden
錯誤。 -
使用.htaccess 文件
- 也可以在網站的根目錄下創建
.htaccess
文件來配置防盜鏈。例如:
- 也可以在網站的根目錄下創建
apache
RewriteEngine On
# 允許來自example.com及其子域名的Referer
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]
# 對于不合法的Referer,返回403錯誤
RewriteRule .* - [F]
- 這種方式與在配置文件中配置類似,只是
.htaccess
文件可以更靈活地針對特定目錄進行配置,而無需修改全局的 Apache 配置文件。
IIS 服務器
- 基于 URL 重寫模塊
- 首先需要在 IIS 服務器上安裝 URL 重寫模塊。然后在網站的
web.config
文件中進行配置,例如:
- 首先需要在 IIS 服務器上安裝 URL 重寫模塊。然后在網站的
- 上述配置中,
rewrite
節點下的rule
定義了防盜鏈規則。match
元素匹配所有的 URL,conditions
元素設置了允許的 Referer 條件,與 Apache 的配置類似。如果 Referer 不滿足條件,action
元素會終止請求,返回403 Forbidden
錯誤。
這些只是基本的防盜鏈配置方法,實際應用中可以根據具體需求進行調整和擴展。同時,防盜鏈技術也在不斷發展,還可以結合其他安全措施來提高資源的安全性。
一、防盜鏈配置通過文件進行限制(限制域名、IP)
實現思路:訪問http://192.168.72.130:9999/a.html 鏈接,a.html中配置有http://192.168.72.130:8888/aa.webp訪問aa.webp圖片的訪問鏈接,通過配置防盜鏈來實現房屋內控制。
步驟一:配置a.html內容
通過a.html文件里的頁面跳轉鏈接進行訪問,已經配置了跨域,詳見上一篇文章:Nginx — 跨域問題演示以及解決方法-CSDN博客
<html><head><meta charset="utf-8"><title>跨域問題演示</title><script src="jquery.js"></script><script>$(function(){$("#btn").click(function(){$.get('http://192.168.72.130:8888/getUser',function(data){alert(JSON.stringify(data));});});});</script></head><body><input type="button" value="獲取數據" id="btn"/><img src="http://192.168.72.130:8888/aa.webp" /><br/></body>
</html>
步驟二:配置訪問到a.html資源的nginx配置
server {listen 9999;server_name localhost;gzip on;root /opt/nginx;location / {index a.html;}
}
步驟三:配置aa.webp圖片資源訪問防盜鏈
1、將aa.webp圖片上傳到/opt/nginx/image目錄下,按照如下配置nginx。
server {listen 8888;server_name localhost;gzip on;location ~*\.(png|jpg|gif|webp){valid_referers none blocked www.baidu.com;if ($invalid_referer){return 403;}root /opt/nginx/image;}
}
2、進行訪問測試
瀏覽器輸入:http://192.168.72.130:8888/aa.webp
能正常進行訪問
步驟三:通過a.html鏈接跳轉進行訪問
瀏覽器輸入:http://192.168.72.130:9999/
?因為配置了防盜鏈,所以訪問失敗!!
步驟四:將網段放行
1、修改nginx配置
server {listen 8888;server_name localhost;gzip on;location ~*\.(png|jpg|gif|webp){#配置接收來自192.168.72網段的訪問valid_referers none blocked www.baidu.com 192.168.72.*;if ($invalid_referer){return 403;}root /opt/nginx/image;}
}
2、進行訪問測試
瀏覽器輸出:http://192.168.72.130:9999/?
訪問成功!!?
二、防盜鏈配置通過目錄進行限制(限制域名、IP)
步驟一:修改nginx的配置
server {listen 8888;server_name localhost;gzip on;location /image {valid_referers none blocked www.baidu.com 192.168.72.*;if ($invalid_referer){return 403;}root /opt/nginx;}
}
瀏覽器輸出:http://192.168.72.130:8888/image/aa.webp
訪問成功!!
步驟二:修改a.html中的鏈接
1、修改a.html中的配置
<html><head><meta charset="utf-8"><title>跨域問題演示</title><script src="jquery.js"></script><script>$(function(){$("#btn").click(function(){$.get('http://192.168.72.130:8888/getUser',function(data){alert(JSON.stringify(data));});});});</script></head><body><input type="button" value="獲取數據" id="btn"/><img src="http://192.168.72.130:8888/image/aa.webp" /><br/><a href="http://192.168.72.130:8888/image/centen.html">點擊這里訪問頁面</a><br/></body>
</html>
2、在/opt/nginx/image目錄下添加centen.html文件
?步驟三:訪問測試
瀏覽器輸出:http://192.168.72.130:9999/?
?
總結:
通過目錄訪問限制的方法可以將不同的資源放到對應的目錄下這樣可以實現對資源的控制統一控制。?
三、第三方模塊ngx_http_accesskey_module 補充?