大家在訪問網站的時候,經常會看到圖片展示不出來的時候,如下圖

大家有沒有想過這是為什么嘛?其實這是一種簡單的防盜鏈的處理,那么盜鏈是什么呢?為什么需要防呢?咱們今天來一起揭開它神秘的面紗。
盜鏈的概念
盜鏈是指在自己的頁面上展示一些並不在自己服務器上的一些內容, 獲取別人的資源地址,繞過別人的資源展示頁面,直接在自己的頁面上向最終用戶提供此內容。 一般被盜鏈的都是圖片、 音樂、視頻、軟件等資源。通過盜鏈的手段可以減輕自己服務器的負擔
比如我直接在自己的網站上
<img src="http:www.baidu.com/imagepath/image.png">
這樣就可以直接展示百度的圖片,但是實際上是無法展示的(如下圖),之所以無法展示是因為百度的圖片做過防盜鏈處理

防盜鏈的工作原理
通過Refer或者簽名,網站可以檢測目標網頁訪問的來源網頁,如果是資源文件,則可以追蹤到顯示他的網頁地址 一旦檢測到來源不是本站,即進行阻止或者返回指定的頁面
防盜鏈的實現方法
Nginx模塊,
ngx_http_referer_module用於阻擋來源非法域名的請求 nginx指令valid_refers,全局變量$invalid_refer
對資源的防盜鏈nginx配置為
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
valid_referers none blocked test.com *.test.com; //加none的目的是確保瀏覽器可以直接訪問資源
if($invalid_referer)
{
#return 403; // 直接返回403
rewrite ^/ http://www.test.com/403.jpg;//返回指定提示圖片
}
}
對目錄的防盜鏈nginx配置為
location /images/
{
valid_referers none blocked test.com *.test.com;
if($invalid_referer)
{
#return 403;
rewrite ^/ http://www.test.com/403.jpg;
}
但是傳統的防盜鏈也會存在一些問題,因為refer是可以偽造的, 所以可以使用加密簽名的方式來解決這個問題。 什么是加密簽名?就是當我們請求一個圖片的時候,我要給他帶一些簽名過去,然后返回圖片的時候我們判斷下簽名是否正確,相當於對一個暗號。
可以使用第三方模塊HttpAccessKeyModule來解決防盜鏈的問題,我們需要去安裝。
安裝好有這樣一個指令:
accesskey on|off 模塊開關
accesskey_hashmethod md5 | sha-1 簽名加密方式
accesskey_arg GET參數名稱
accesskey_signature 加密規則
location ~.*\.(gif|jpg|png|flv|swf|rar|zip)$
{
accesskey on;
accesskey_hashmethod md5;
accesskey_arg sign;
accesskey_signature "mypass$remote_addr";
}
意思是mypass加客戶端ip通過md5加密 圖片文件代碼:
<?php
$sign = md5('mypass' . $_SERVER['REMOTE_ADDR']);
echo '<img src="./photo.jpg?sign='. $sign .'">';
?>
以上就是防盜鏈的兩種形式,歡迎伙伴們進行討論留言。
