什麼是盜鏈和防盜鏈?
“盜鏈” 說白了就是利用別人網站的資源鏈接放在自己的站點,在未經允許的情況下去獲取別人網站裏面的圖片或者視頻等資源,導致資源所有者的網站的流量費用增加或收入減少。
爲了防止資源鏈接隨意被人盜用的手段被稱爲 “防盜鏈”。
防盜鏈如何實現呢?
大多數站點的策略很簡單: 判斷request
請求頭的referer
是否來源於本站。若不是,則拒絕訪問真實圖片。
而我們知道: 請求頭是來自於客戶端,是可僞造的。
場景
一些網上尋找的圖片視頻資源地址,在瀏覽器地址框裏輸入是可以查看到。但是用到了項目上就顯示不出來,報403錯誤。這是因爲,這些資源地址設置了防盜鏈措施。
剛開始的我, 很
後來,我明白了。。。
瀏覽器請求時,請求頭的Referer爲空,所以可以請求到資源。
但在項目上,請求頭的Referer不爲空(爲:來源地址),對方的服務器對Referer做了限制,因此請求不到數據。
那麼,我們僞造一個正確的referer來訪問不就行了?
下面給出簡單Referer限制的防盜鏈 解決辦法!!!
nodejs服務器做防盜鏈資源中轉
整個業務邏輯大概像這樣:
- 自己的服務器後臺接受帶目標圖片url參數的請求
- 僞造referer請求目標圖片
- 把請求到的數據作爲response返回
express 解決方法
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');
});
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 解決方法
const Koa = require('koa')
const app = new Koa()
const router = require('./routes/referer');
app.use(router.routes());
app.listen(3000)
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