你知道資源防盜鏈是如何實現的嗎?

  • 2019 年 10 月 4 日
  • 筆記

為什麼要搞個防盜鏈,難道怕自行車被偷嗎?現在知識都共享了,還擔心什麼數據被別人使用嗎!

防盜鏈,就是防你盜用我的鏈接。你在你的網站上引用了我的資源(圖片,音頻),你跑起來倒是沒什麼事,但是會浪費我的流量,資源被引用的多了起來,我這邊的伺服器可能就扛不住掛了,你說這是多麼悲哀的事情!

一般情況下以圖片防盜鏈居多,我們也來看看圖片防盜鏈是如何做出來的。

圖片防盜鏈:先來看個圖,這個圖是我在本地啟了一個服務後,分別載入了百度和360搜索兩個網站的圖片鏈接,對應防盜鏈下的樣子(說好的美少女呢)

百度的做法是用另外一張圖片替換了,而360搜索的做法更粗暴,直接出現了裂圖,訪問403直接給Forbidden了。這就是所謂的圖片防盜鏈了,畢竟看到這樣的圖,大家也沒了興緻,和之前想要的圖片差距太大,也就沒必要再保留了

那麼關鍵部分來了,圖片防盜鏈是如何做到的呢?且看下圖

圖中所示,在請求頭中有Host(請求的主機)和Referer(來源)兩個參數,之所以會形成防盜鏈,那是因為Host和referer所對應的值不相同造成的。

下面我們就直接來實踐一下,做一個圖片防盜鏈,具體例子如下:

該圖為整個文件夾目錄結構,下面參考該目錄結構來做(注意看程式碼中的注釋哦)

// js部分  const fs = require('fs');  const path = require('path');  const http = require('http');  const url = require('url');  const getHostName = function (str) {      let { hostname } = url.parse(str);      return hostname;  };  http.createServer((req, res) => {      let refer = req.headers['referer'] || req.headers['referrer'];  // 請求頭都是小寫的      // 先看一下refer的值,去和host的值作對比,不相等就需要防盜鏈了      // 要讀取文件 返回給客戶端      let { pathname } = url.parse(req.url);      let src = path.join(__dirname, 'public', '.' + pathname);      // src代表我要找的文件        fs.stat(src, err => {   // 先判斷文件存不存在          if (!err) {              if (refer) {    // 不是所有圖片都有來源                  let referHost = getHostName(refer);                  let host = req.headers['host'].split(':')[0];                    if (referHost !== host) {                      // 防盜鏈                      fs.createReadStream(path.join(__dirname, 'public', './1.jpg')).pipe(res);                  } else {                      // 正常顯示,如果路徑存在,可以正常顯示直接返回                      fs.createReadStream(src).pipe(res);                  }              } else {                  // 正常顯示,如果路徑存在,可以正常顯示直接返回                  fs.createReadStream(src).pipe(res);              }          } else {              res.end('end');          }      });    }).listen(8888);

通過以上不到40行的程式碼就完成了圖片防盜鏈,想來也並沒有辣么麻煩,利用請求頭來做的事情還是蠻多的,先來看看防盜鏈的效果吧

<-- html部分 -->  <body>      <img src="http://www.chenhd.me:8888/2.png" />  </body>

這裡我們修改一下hosts文件,把127.0.0.1指定為兩個不同的域名訪問

  1. 127.0.0.1 www.chenhd.me
  2. 127.0.0.1 www.chd.me

友情提示:

  • windows 系統修改 hosts 文件地址為 C:WindosSystem32driversetc下的hosts文件,拷貝hosts文件修改後替換即可
  • mac 系統下較為方便通過終端直接 sudo vi /etc/hosts修改即可

由於 html 部分我們圖片引用的地址就是 www.chenhd.me 域名下的圖片,所以這種情況屬於正常訪問,直接展示 2.png 圖片了,就是這麼酷

當修改域名為www.chd.me的時候,再次訪問就發現已經替換為防盜鏈圖片1.jpg了,看如下效果

以上內容就實現了如何做一個圖片防盜鏈,防止別人使用你的資源,當然不僅僅是圖片防盜鏈,音頻,影片等也可以根據此方法實現,之後大家也可以在工作中嘗試嘗試。

文章來源:

chenhongdong https://juejin.im/post/5adc0d03518825673a2022b7