node實現防盜鏈

熱愛前端的17號誒發表於2020-04-16

什麼是防盜鏈

盜鏈,顧名思義就是盜竊連結,就是在他人未經允許的情況下,去使用他人站點的任何圖片,視訊,內容等資源,來藉此提升已用的站點的活躍度,嚴重損壞了別人的利益。那麼防盜鏈就是採用一些辦法阻止自己的資源被盜用。

模擬圖片防盜鏈

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

<body>
  <h3>哈哈哈哈哈</h3>
  <img src="http://c.hiphotos.baidu.com/image/w%3D210/sign=ed30880babec8a13141a50e1c7029157/d52a2834349b033be1a9503e17ce36d3d539bd35.jpg" alt="">
</body>

分兩種形式展示

  • 本地file直接開啟index.html
    本地1
  • 本地起一個服務,模擬站點,開啟index.html
    本地2

由此可見,沒有起服務時顯示的是正常的圖片,起了服務後就變了另一張圖片,這就是百度對圖片做了防盜鏈處理。
從這個可以得出一個結論,所謂的防盜鏈處理是針對與伺服器上而言的,file起的頁面是無效的

實現防盜鏈

據查閱資料可知,防盜鏈是可以通過Host和Referer進行比較來實現的,下面用node實現一個防盜鏈

  • 1 準備兩種圖片,一個正常下載的圖片的,一個為了防盜而顯示的圖片。

  • 2 準備一個域名,為了模擬伺服器。
    host檔案 更改

    127.0.0.1 www.sqh17.com
    
  • 2 實現

    • 思路:

      1. 建立http的server
      2. 首先讀取檔案,判斷檔案是否存在
      3. 判斷referer和host是否一致,不一致則進行圖片
      4. 啟動服務
    • 程式碼
      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時,顯示的是正常的圖片

        本地3
        本地3

        當位址列上的地址是http://localhost.com:8888/index.html時,顯示的是防盜鏈的圖片

        本地3
        本地3

總結

防盜鏈的方式有很多,利用referer和host的比較來實現防盜鏈是其中的一種,上述方式雖然很簡單,但是是提供了一種思路,方便為自己以後的網站搭建。
本文若有什麼不對的地方,歡迎大家提出來,一起進步,我把例子和文件放到了GitHub上,歡迎查閱

相關文章