什麼是防盜鏈
盜鏈,顧名思義就是盜竊連結,就是在他人未經允許的情況下,去使用他人站點的任何圖片,視訊,內容等資源,來藉此提升已用的站點的活躍度,嚴重損壞了別人的利益。那麼防盜鏈就是採用一些辦法阻止自己的資源被盜用。
模擬圖片防盜鏈
一般情況下圖片防盜鏈居多,我們來看看圖片防盜鏈是如何做出來的。
<body>
<h3>哈哈哈哈哈</h3>
<img src="http://c.hiphotos.baidu.com/image/w%3D210/sign=ed30880babec8a13141a50e1c7029157/d52a2834349b033be1a9503e17ce36d3d539bd35.jpg" alt="">
</body>
分兩種形式展示
- 本地file直接開啟index.html
- 本地起一個服務,模擬站點,開啟index.html
由此可見,沒有起服務時顯示的是正常的圖片,起了服務後就變了另一張圖片,這就是百度對圖片做了防盜鏈處理。
從這個可以得出一個結論,所謂的防盜鏈處理是針對與伺服器上而言的,file起的頁面是無效的
實現防盜鏈
據查閱資料可知,防盜鏈是可以通過Host和Referer進行比較來實現的,下面用node實現一個防盜鏈
-
1 準備兩種圖片,一個正常下載的圖片的,一個為了防盜而顯示的圖片。
-
2 準備一個域名,為了模擬伺服器。
host檔案 更改127.0.0.1 www.sqh17.com
-
2 實現
-
思路:
- 建立http的server
- 首先讀取檔案,判斷檔案是否存在
- 判斷referer和host是否一致,不一致則進行圖片
- 啟動服務
-
程式碼
index.html檔案<body> <h3>哈哈哈哈哈</h3> <img src="http://www.sqh17.com:8888/2.png" alt=""> </body>
js檔案
let fs = require('fs'); let path = require('path'); let http = require('http'); let url = require('url'); let static = path.resolve(__dirname, "public"); // 靜態資源目錄 let server = http.createServer((req, res) => { let referer = req.headers['referer'] || req.headers['referered']; // 相容性處理 let pos = path.join(static, url.parse(req.url).pathname); // 處理成絕對路徑 fs.stat(pos, err => { // 先判斷檔案存不存在 if (!err) { if (referer) { // 當存在referer let refererHost = url.parse(referer).hostname; // referer地址 let host = req.headers['host'].split(':')[0]; // host地址 if (refererHost !== host) { // 若不一致,則替換圖片 fs.createReadStream(path.join(static, '/fail.png')).pipe(res); } else { fs.createReadStream(pos).pipe(res); } } else { // 第一次index.html的顯示 fs.createReadStream(pos).pipe(res); } } else { res.end("Not Found"); } }); }) server.listen('8888', () => { console.log('伺服器開啟成功', '埠:8888'); })
-
演示
當位址列上的地址是http://www.sqh17.com:8888/index.html時,顯示的是正常的圖片
當位址列上的地址是http://localhost.com:8888/index.html時,顯示的是防盜鏈的圖片
-
-
總結
防盜鏈的方式有很多,利用referer和host的比較來實現防盜鏈是其中的一種,上述方式雖然很簡單,但是是提供了一種思路,方便為自己以後的網站搭建。
本文若有什麼不對的地方,歡迎大家提出來,一起進步,我把例子和文件放到了GitHub上,歡迎查閱