nodejs 伺服器作防盜鏈圖片中轉
阿新 • • 發佈:2019-01-25
防盜鏈如何實現:大多數站點的策略很簡單,判斷request請求頭的refer是否來源於本站。若不是,拒絕訪問真實圖片。而我們知道: 請求頭是來自於客戶端,是可偽造的。
HTTP Referer是header的一部分,當瀏覽器向web伺服器傳送請求的時候,一般會帶上Referer,告訴伺服器我是從哪個頁面連結過來的,伺服器籍此可以獲得一些資訊用於處理。
因此,大致思路如下:
1. 自己的伺服器後臺接受帶目標圖片url引數的請求
api?url=http://abc.com/image.png
2. 偽造refer請求目標圖片
var url=req.query.url;
var options = {
method: "GET",
url:url,
headers:{
"Referer": "https://abc.com/"
}
};
3.把請求到的資料作為response返回
//request 模組支援管道方法,可以和 shell 的管道一樣理解。
request(options).pipe(res);
完整程式碼如下:
var express = require('express');
var request = require('request');
var router = express.Router();
router.get('/',function(req,res,next){
var url=req.query.url;
var options = {
method: "GET",
url:url,
headers:{
"Referer": referrer
}
};
request(options).pipe(res);
})
module.exports = router;
另一種方法,不用request模組,而用http模組。
var express = require('express');
var router = express.Router();
var url = require('url');
var http = require('http');
router.get('/',function(req,res,next){
var imgUrl = url.parse(req.query.url);
imgUrl.headers = {
"Referer": referrer
};
var opt={
hostname:imgUrl.hostname,
port:'80',
path:imgUrl.path,
headers:imgUrl.headers
}
var request = http.request(opt);
request.on('response', function(response) {
var c = "";
response.setEncoding('binary');
response.on('data', function(chunk) {
c += chunk;
});
response.on('end', function() {
res.writeHead(200, response.headers);
res.write(c, "binary");
res.end();
})
});
}