一. 防盜鏈原理javascript
http 協議中,若是從一個網頁跳到另外一個網頁,http 頭字段裏面會帶個 Referer。圖片服務器經過檢測 Referer 是否來自規定域名,來進行防盜鏈。php
設置突破防盜鏈方法html
1. 使用apache文件FileMatch限制,在httpd.conf中增長 ( 其實也能夠將把下面的語句存成一個.htaccess文件),並放到你的網站的根目錄(就是www/html目錄),這樣子別人就沒有辦法盜連你的東東了~~java
SetEnvIfNoCase Referer "^http://kuaishou.com/" local_ref=1 Order Allow,Deny Allow from env=local_ref Allow from 127.0.0.1
2. 使用rewrite,須要增長apache的mode_rewrite,支持.htaccess文件目錄權限限制
在虛擬主機根目錄增長.htaccess文件,描述從定向,把非本地地址refer的圖片文件都從定向到警告圖片或者警告網頁上。 node
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ [NC] RewriteCond %{HTTP_REFERER} !simcole.cn [NC] RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC] RewriteCond %{HTTP_REFERER} !google.com [NC] RewriteCond %{HTTP_REFERER} !baidu.com [NC] RewriteCond %{HTTP_REFERER} !bloglines.com [NC] //這部分是判斷是否盜鏈,若是以上條件都成立(即訪問圖片的請求,既不是直接輸入網址,也不是來自simcole.cn,也不是來自zhuaxia.com,也不是來自google.com,也不是來自baidu.com,也不是來自bloglines.com 的話),就執行下列轉向: RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L] //意思是讓全部盜鏈 img 目錄下 jpg、gif、png、bmp、swf、jpeg 文件的網頁,顯示的圖片都用 image 目錄下的 replace.gif 圖片替換掉。 注意替換顯示的圖片不要放在設置防盜鏈的 img 目錄下。若是照上面的規則判斷出圖片請求不是盜鏈的,就執行如下轉向: RewriteRule ^(.*)$ http://image.simcole.cn/image/$1 [L] //意思是對 img 目錄下全部的請求都轉向到目標服務器,好比有個圖片原來的 url 是 http://www.bebecn.com/img/girl.jpg ,如今就會轉到 http://image.bebecn.com/image/girl.jpg 去
3. 經過php直接獲取資源,在php中進行攔截nginx
$referer = $_SERVER['HTTP_REFERER']; //HTTP Referer是header的一部分,當瀏覽器向web服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的,服務器基此能夠得到一些信息用於處理。 $selfurl = $_SERVER['HTTP_HOST'];//在php中,咱們通常經過$_SERVER['HTTP_HOST']來活得URL中網站的域名或者ip地址。 if(false == strpos($referer,$selfurl)) { echo '非法盜鏈!'; exit(1); }
4. nginx防盜鏈web
location ~* \.(gif|jpg|png|bmp)$ { valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.; if ($invalid_referer) { return 403; #rewrite ^/ http://www.ttlsa.com/403.jpg; } }
參數說明:算法
none:「Referer」 來源頭部爲空的狀況express
blocked:「Referer」來源頭部不爲空,可是裏面的值被代理或者防火牆刪除了,這些值都不以http://或者https://開頭.apache
server_names:「Referer」來源頭部包含當前的server_names(當前域名)
5. nodejs express模塊防盜鏈
var express = require('express'), path = require('path'), app = express(); var AntiLeech = require('express-anti-leech'); // 容許引用的域名白名單 var hosts = ['localhost', 'localhost:8004']; // 反盜鏈類型 var exts = ['.png', '.jpg', '.jpeg', '.gif', '.swf', '.flv']; // 盜鏈默認指向圖片 var pictrue = "/images/default.png"; app.use(AntiLeech({ allow: hosts, exts: exts, log: console.log, // 你也可使用本身的方法來記錄 default: pictrue })); // 請在調用靜態資源以前先使用反盜鏈模塊 app.use(express.static(path.join(__dirname, 'public'))); app.set('port', process.env.PORT || 8004); app.get('/', function(req, res) { res.redirect("/index.html"); }); app.listen(app.get('port'), function() { console.log("Express test server listening on http://localhost:" + app.get('port')); });
二. 突破防盜鏈
1. referer爲空
若不發送Referer,也就是沒有來源。那麼官方那邊,就認爲是從瀏覽器直接訪問的,因此就能加載正常的圖片
a. https訪問http
若是盜用網站是 https 的 protocol,而圖片連接是 http 的話,則從 https 向 http 發起的請求會由於安全性的規定,而不帶 referer,從而實現防盜鏈的繞過
b.
某些開啓隱私模式的瀏覽器中,或https頁面引用下,referer是空的
c. 設置頭部信息
Nodejs: res.writeHead(200, { 'Content-Type': 'image/*' }); let url = req.query.url; if (!url) { res.send(""); return false; } superagent.get(req.query.url) .set('Referer', '') .set("User-Agent", 'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.933.400 QQBrowser/9.4.8699.400' ) .end(function(err, result) { if (err) { //res.send(err); return false; } res.end(result.body); return; });
2. 代碼內請求僞造referer
PHP: $http = new Http("http://www.baidu.com/img/avatar.jpg"); $http->setHeader('Referer:http://www.baidu.com/');
3. 利用iframe僞造請求referer
function showImg( url ) { var frameid = 'frameimg' + Math.random(); window.img = '<img id="img" src=\''+url+'?'+Math.random()+'\' /><script>window.onload = function() { parent.document.getElementById(\''+frameid+'\').height = document.getElementById(\'img\').height+\'px\'; }<'+'/script>'; document.write('<iframe id="'+frameid+'" src="javascript:parent.img;" frameBorder="0" scrolling="no" width="100%"></iframe>'); }
4. meta標籤控制referer
若是頁面中包含了以下 meta 標籤,全部從當前頁面中發起的請求將不會攜帶 referer:
<meta name="referrer" content="never">
若是頁面中包含了以下 meta 標籤,則從當前頁面中發起的 http請求將只攜帶 origin 部分(注:根據原文中的語境,我理解這裏的 origin 是包含了 schema 和 hostname 的部分 url,不包含 path 等後面的其餘 url 部分),而不是完整的 URL :
<meta name="referrer" content="origin">
注意:在使用本文中所述的 meta 標籤的時候,瀏覽器原有的 referer 策略將被打破,好比從 http 協議的頁面跳轉到 https 的頁面的時候,若是設置了適當的值,也會攜帶 referer。
技術細節:
referer 的 metedata 參數能夠設置爲如下幾種類型的值:
never always origin default
若是在文檔中插入 meta 標籤,而且 name 屬性的值爲 referer,瀏覽器客戶端將按照以下步驟處理這個標籤:
1.若是 meta 標籤中沒有 content 屬性,則終止下面全部操做 2.將 content 的值複製給 referrer-policy ,並轉換爲小寫 3.檢查 content 的值是否爲上面 list 中的一個,若是不是,則將值置爲 default
上述步驟以後,瀏覽器後續發起 http 請求的時候,會按照 content 的值,作出以下反應(下面 referer-policy 的值即 meta 標籤中 content 的值):
1.若是 referer-policy 的值爲never:刪除 http head 中的 referer; 2.若是 referer-policy 的值爲default:若是當前頁面使用的是 https 協議,而正要加載的資源使用的是普通的 http 協議,則將 http header 中的 referer 置爲空; 3.若是 referer-policy 的值爲 origin:只發送 origin 部分; 4.若是 referer-policy 的值爲 always:不改變http header 中的 referer 的值,注意:這種狀況下,若是當前頁面使用了 https 協議,而要加載的資源使用的是 http 協議,加載資源的請求頭中也會攜帶 referer。
三. 防護反防盜鏈
關於防護方法,有如下3點:
一、不容許referer爲空(不建議,因在某些開啓隱私模式的瀏覽器中,或https頁面引用下,referer是空的)
二、地址變動(lighttpd的是根據有效時間,nginx的根據是md5,IP地址變化)
三、登陸校驗(如必須登陸網站賬號後才能訪問)
擴展一:視頻防盜鏈和加密
視頻加密技術分爲兩種:
1. 防盜鏈:經過驗證的用戶才能訪問到沒有加密的視頻內容,這種方案存在視頻很容易就被下載的風險,嚴格來講這不屬於加密。這種方式實際上是資源訪問受權,它實現起來簡單。
2. 加密視頻自己:經過對稱加密算法加密視頻內容自己,用戶得到加密後的視頻內容,經過驗證的用戶能夠獲取解密視頻的密鑰,在客戶端解密後播放。這種方式實現起來流程複雜會帶來更多的計算量。
市面上常見的防盜手段:
1.設置 referer 白名單,非白名單內的一概拒絕訪問
2.在 URL 中添加 token 校驗,使用私有 key 和 time 實時計算 token,服務器做校驗
3.在第2條的基礎上,使用 https POST token 參數,增長抓取難度
4.使用 HLS(m3u8) 自帶的加密功能,加密傳輸數據,沒有密碼沒法播放
5.使用數字版權保護(DRM)技術
還有一些不太常見的手段:
1.使用HTTPS客戶端證書,服務器能夠對客戶端進行識別(目前常見的HTTPS是服務器端證書)
2.使用HLS(m3u8)自帶的加密功能,並對密碼作二次處理,客戶端通過兩次解密才能獲得原數據
3.對視頻編碼進行二次處理,解碼時須要知道算法,不然無數獲得原數據,見於海康監控系統
詳解見:http://imweb.io/topic/59819d7bf8b6c96352a593ff
擴展二:防止網站被鏡像,被iframe
1.防止網站被鏡像(被惡意解析和轉發等)
現象:他人域名訪問到的是個人網站解析的ip地址個人
解決方法:
http.ini裏能夠這樣寫
"RewriteCond Host: !^www.web\.cn$ RewriteRule (.*) http\://www\.web\.cn$1 [I,RP]"
.htaccess裏能夠這樣寫
「RewriteCond %{HTTP_HOST} !^www.web.cn$ [NC] RewriteRule ^(.*)$ http://www.web.cn/$1 [L,R=301]」
代碼的意思很是簡單:訪問這個網站的域名若是不是"www.web.cn"就自動跳轉到"www.web.cn"上。這樣設置就不怕本身辛辛苦苦維護的網站被別人鏡像了。
2.防止網址被iframe
代碼:在頁面底部或其它公用部位加入以下代碼
<script type=」text/javascript> if(window!=parent) window.top.location.href = window.location.href; < /script>
代碼的意思也很簡單,用js方法檢測地址欄域名是否是當前網站綁定的域名,若是不是,則跳轉到綁定的域名上來,這樣就不怕網站被別人iframe了。
3.如何防止網站被複制保存或者被下載
參考文檔:http://www.3lian.com/edu/2013/10-12/101296.html
參考:
http://www.freebuf.com/news/57497.html
https://www.zhihu.com/question/35044484/answer/350722473
https://www.cnblogs.com/lydiawork/p/7838153.html
https://blog.csdn.net/enweitech/article/details/45745171
https://www.zhihu.com/question/64369225/answer/219528505