1. 程式人生 > >nodejs 伺服器作防盜鏈圖片中轉

nodejs 伺服器作防盜鏈圖片中轉

防盜鏈如何實現:大多數站點的策略很簡單,判斷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();
         })
     });
}