圖片視頻等資源中轉,用nodejs解決防盜鏈問題

什麼是盜鏈和防盜鏈?

“盜鏈” 說白了就是利用別人網站的資源鏈接放在自己的站點,在未經允許的情況下去獲取別人網站裏面的圖片或者視頻等資源,導致資源所有者的網站的流量費用增加或收入減少。在這裏插入圖片描述
爲了防止資源鏈接隨意被人盜用的手段被稱爲 “防盜鏈”

防盜鏈如何實現呢?

大多數站點的策略很簡單: 判斷request請求頭的referer是否來源於本站。若不是,則拒絕訪問真實圖片。
而我們知道: 請求頭是來自於客戶端,是可僞造的。在這裏插入圖片描述

場景

一些網上尋找的圖片視頻資源地址,在瀏覽器地址框裏輸入是可以查看到。但是用到了項目上就顯示不出來,報403錯誤。這是因爲,這些資源地址設置了防盜鏈措施。

剛開始的我,
在這裏插入圖片描述後來,我明白了。。。

瀏覽器請求時,請求頭的Referer爲空,所以可以請求到資源。

但在項目上,請求頭的Referer不爲空(爲:來源地址),對方的服務器對Referer做了限制,因此請求不到數據。

那麼,我們僞造一個正確的referer來訪問不就行了?

下面給出簡單Referer限制的防盜鏈 解決辦法!!!

nodejs服務器做防盜鏈資源中轉
整個業務邏輯大概像這樣:
  1. 自己的服務器後臺接受帶目標圖片url參數的請求
  2. 僞造referer請求目標圖片
  3. 把請求到的數據作爲response返回

express 解決方法

  • index.js部分
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const app = express();
 
//根據不同的功能 劃分模塊 (動態)
app.use(cookieParser());
app.use(bodyParser.json());

app.use('/user',require('./routers/index.js'));
 
app.listen(3000,(res,req)=>{
    console.log('Node app start at port 3000');
});
  • router部分
var express = require('express');
var router = express.Router();
var request = require('request');
var router = express.Router();

router.get('/api', function(req, res, next) {
 
  var url=req.query.url;
    var options = {
         method: "GET",
         url:url,
         headers:{
            "Referer": request.host
         }
     };
     request(options).pipe(res);
});

module.exports = router;

演示:
設置了防盜鏈的資源地址:https://vfx.mtime.cn/Video/2020/01/19/mp4/200119111202176577_1080.mp4

請求資源示例:
http://localhost:3000/user/api?url=https://vfx.mtime.cn/Video/2020/01/19/mp4/200119111202176577_1080.mp4

koa2 解決方法

  • index.js 部分
const Koa = require('koa')
const app = new Koa()

const router = require('./routes/referer');
app.use(router.routes());

app.listen(3000)
  • route部分

const Router = require('koa-router') // koa 路由中間件
const router = new Router(); // 實例化路由
const request = require('request');

router.get('/api', async(ctx, next) => {
 
  var url=ctx.request.query.url;
    var options = {
         method: "GET",
         url:url,
         headers:{
            "Referer": request.host
         }
     };
     
    const PassThrough = require('stream').PassThrough;
    ctx.body = request(options)
        .on('response', response => {
            Object.keys(response.headers).forEach((key) => {
                // if ('content-length' === key) return;
                if ('transfer-encoding' === key) return;
                ctx.set(key, response.headers[key]);
            });
        })
        .on('error', ctx.onerror)
        .pipe(PassThrough())
});

module.exports = router;

演示:
設置了防盜鏈的資源地址:https://vfx.mtime.cn/Video/2020/01/19/mp4/200119111202176577_1080.mp4

請求資源示例:
http://localhost:3000/api?url=https://vfx.mtime.cn/Video/2020/01/19/mp4/200119111202176577_1080.mp4

在這裏插入圖片描述

發佈了54 篇原創文章 · 獲贊 229 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章