盜鏈的概念
指在本身的頁面上展現一些並不在本身服務器上的內容。也就是得到他人服務器上的資源地址,繞過別人的資源展現頁面,直接在本身的頁面上向最終用戶提供此內容。如,小站盜用大站的圖片、音樂、視頻、軟件等資源來減輕本身服務器的負擔。php
防盜鏈的概念
防止別人經過一些技術手段繞過本站的資源展現頁面,盜用本站的資源。繞開本站資源展現頁面的資源連接失效就達到了防盜鏈。node
防盜鏈的工做原理
經過Referer或者簽名,網站能夠檢測到目標頁面訪問的來源頁面,若是是資源文件,則能夠跟蹤到顯示它的網址頁面。一旦檢測到來源不是本站即進行組織或者返回指定的頁面。
觀察一下NetWork中Request Header中的Referer,能夠根據此方法判斷是否是盜鏈。
還好比用簽名,就是在請求圖片的時候,帶一個參數,這個參數是彼此以前約定好的簽名,服務器在顯示圖片的時候判斷簽名是否正確來判斷,一般簽名是很複雜的。nginx
Referer方法
Nginx模塊ngx_http_referer_module用於阻擋來源非法的域名請求。
Nginx指令valid_referers,全局變量$invalid_referer。也就是若是想用這個模塊,那麼就用這個變量。
使用方法
valid_referers none | blocked | server_names | string ...;
node :表明是referer是否爲空,寫none表示也是合法的,不寫none表示來源不合法(Referer來源頭部爲空的狀況下)
blocked :"Referer"來源頭部不爲空,可是裏面的值被代理了或者防火牆刪除了,這些值都不以http://或者htps://開頭
server_names : "Referer"來源頭部包含當前的server_names,也就是被容許的源的列表。瀏覽器
下面在虛擬機上作一下測試,WEB服務器是Nginx。服務器
分別是192.168.136.135(實際文件源服務器) 192.168.136.138(盜用鏈接的服務器)測試
進入192.168.136.135的網站根目錄,上傳圖片,編寫一個訪問頁面並連接圖片,訪問查看NetWork網站
下面開始編輯192.168.136.135的Nginx配置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ 其中「gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico」設置防盜鏈文件類型,自行修改,每一個後綴用「|」符號分開! valid_referers none blocked *.baidu.com baidu.com; 就是白名單,容許文件鏈出的域名白名單,自行修改爲您的域名!*.baidu.com這個指的是子域名,域名與域名之間使用空格隔開! rewrite ^/ http://www.baidu.com/img/bd_logo1.png; 這個圖片是盜鏈返回的圖片,也就是替換盜鏈網站全部盜鏈的圖片。這個圖片要放在沒有設置防盜鏈的網站上,由於防盜鏈的做用,這個圖片若是也放在防盜鏈網站上就會被看成防盜鏈顯示不出來了,盜鏈者的網站所盜鏈圖片會顯示X符號。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { #經過valid_referers作防盜鏈,寫了三項 #node :表示referer爲空的時候也能夠顯示(直接在瀏覽器訪問圖片) #blocked :表示防火牆或者代理刪除咱們的referer的時候也能夠 #server_names : "Referer" 來源頭部包含當前的server_names,也就是被容許的源的列表,直接經過IP也能夠(測試用的IP) valid_referers none blocked 192.168.136.135; if ($invalid_referer ) { #return 403; #若是開啓此項,http狀態碼爲403 rewrite ^/ http://www.baidu.com/img/bd_logo1.png; #百度LOGO } expires 30d; access_log off; }
/usr/local/nginx/sbin/nginx -s reload //修改完成以後,別忘了從新加載一下Nginx配置,平滑重啓
下面在盜用的服務器上作一下測試,圖片的鏈接地址是http://192.168.136.135/img/1.png,而後訪問192.168.136.138查看響應加密
location /img/ { #經過valid_referers作防盜鏈,寫了三項 #node :表示referer爲空的時候也能夠顯示(直接在瀏覽器訪問圖片) #blocked :表示防火牆或者代理刪除咱們的referer的時候也能夠 #server_names : "Referer" 來源頭部包含當前的server_names,也就是被容許的源的列表,直接經過IP也能夠(測試用的IP) valid_referers none blocked 192.168.136.135; if ($invalid_referer ) { #return 403; #若是開啓此項,http狀態碼爲403 rewrite ^/ http://www.baidu.com/img/bd_logo1.png; #百度LOGO } expires 30d; access_log off; }
這樣設置差很少就能夠起到防盜鏈做用了,上面說了,這樣並非完全地實現真正意義上的防盜鏈!固然也能夠把前兩項去掉:valid_referers 192.168.136.135;,更嚴謹一步防止盜鏈。由於能夠僞造Referer。 加密簽名方法 請求圖片的時候帶簽名過去,當返回圖片的時候判斷簽名是否正確,也就是暗號。 加密簽名的時候須要使用第三方模塊HttpAccessKeyModule,由於在服務端php裏須要顯示圖片的時候跟一個簽名,交給Nginx的時候,Nginx須要作一個判斷,判斷前面是否正確,Nginx在判斷的時候就須要這個模塊了。 連接:https://pan.baidu.com/s/1bqekisB 密碼:h24h //下載地址 用法: 用以前須要安裝,安裝好配置指令 accesskey on | off //模塊開關 開啓以後
accesskey_hashmethod md5 | sha-1 //簽名加密的方式 accesskey_arg GET 參數名稱 //咱們去請求圖片或者資源的時候,後面帶的參數名稱是什麼,須要傳遞簽名,可是前提須要知道簽名的key(名稱)是多少 accesskey_signature //加密規則,須要跟Nginx說咱們的加密規則是什麼,須要PHP的規則和Nginx的規則保持一致,那麼纔會控制圖片的顯示 複製代碼 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { accesskey on; accesskey_hashmethod md5; accesskey_arg sign; #參數鍵名 accesskey_signaurre "mytest$remote_addr"; #mytest字符串拼接客戶端ip而後md5加密 expires 30d; } 複製代碼
保存reloadurl
而後再咱們的PHP端模擬訪問一個圖片spa
<?php $accesskey = "mytest"; //自定義的祕鑰串 $user_addr = $_SERVER['REMOTE_ADDR']; //客戶端IP $urlkey = md5($accesskey .$user_addr ); echo '<img src="./img/1.png?sing="'. $urlkey .'">'; //sign是Nginx配置中的參數鍵 echo '<img src="./img/1.png">'; //對比測試
測試如下,OK,NetWork圖片referer帶參數,實現了防盜鏈