防盗链如何实现:大多数站点的策略很简单,判断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();
})
});
}