服务器作防盗链图片中转,Node.js 上手项目简明教程
文/李信栋
前几天随手写的 chrome 插件遇到了防盗链问题,由于插件不能用 js iframe 的方法反防盗链,于是想用服务器做个中转。记录一下上手项目的各个点,以后再用 nodejs 就不用到处查资料了。
之前没有一套特别熟悉的 web 开发框架,加上插件存储服务依赖的平台 LeanCloud 刚好支持部署 nodejs 网站,刚好拿这个小项目作为 nodejs 上手项目。
怎么「破解防盗链」呢?
想要破解,就得先知道目标——防盗链如何实现。
大多数站点的策略很简单: 判断request请求头的refer是否来源于本站。若不是,拒绝访问真实图片。而我们知道: 请求头是来自于客户端,是可伪造的。
思路
那么,我们伪造一个正确的refer来访问不就行了?
整个业务逻辑大概像这样:
- 自己的服务器后台接受带目标图片url参数的请求
- 伪造refer请求目标图片
- 把请求到的数据作为response返回
这就起到了图片中转的作用。
1. 项目是什么样子
1.1 接口的样子?
- 有一个开放接口
- 接口有一个参数,api?url=abc.com/image.png,大…
- 响应内容是反防盗链后的真实图片
1.2 应该怎么做?
- 把服务器跑起来
- 处理 GET 请求
- 分析请求参数
- 下载原图
- response 原图
2. 学习路径(在对目标未知的前提下提出疑问)
- 如何开始,建立服务器
- 如何处理基本请求 GET POST
- 如何下载图片并转发
- 完成基本功能,上线
- 优化
2.1 如何开始,建立服务器
主要是 http.createServer().listen(port) 这组方法,建立服务器、监听端口一键搞定。
var http = require('http');http.createServer(function (request, response){// do things here
}).listen(8888);console.log('Server running at: 8888');
2.2 如何处理基本请求 GET POST
createServer 回调方法的两个参数 req res 是 http request 和 response 的内容,打印一下他们的内容。
request 是 InComingMessage 类,打印它的 url 字段。
var http = require('http');
var url = require('url');
var util = require('util');
http.createServer(function(req, res){res.writeHead(200, {'Content-Type': 'text/plain'});res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);
请求
http://localhost:3000/api?url=http://abc.com/image.png
请求结果
Url {protocol: null,slashes: null,auth: null,host: null,port: null,hostname: null,hash: null,search: '?url=http://abc.com/image.png',query: { url: 'http://abc.com/image.png' },pathname: '/api',path: '/api?url=http://abc.com/image.png',href: '/api?url=http://abc.com/image.png' }
query 字段刚好是我们想要的内容,下载这个字段对应的图片。
2.3 如何下载图片并转发
request 模块支持管道方法,可以和 shell 的管道一样理解。
这可以省很多事,不需要在本地存储图片,不需要处理杂七杂八的事情,甚至不需要再去了解 nodejs 的流。一个方法全搞定。
关键方法: request(options).pipe(res)
var options = {uri: imgUrl, // 这个 uri 为空时,会认为该字段不存在,报异常headers: {'Referer': referrer // 解决部分防盗链选项}};request(options).pipe(res);
2.4 完成基本功能,上线
项目地址
完整代码
'use strict';var router = require('express').Router();var http = require('http');var url = require('url');var util = require('util');var fs = require('fs');var callfile = require('child_process');var request = require('request');router.get('/', function(req, res, next){var imgUrl = url.parse(req.url, true).query.url;console.log(url.parse(req.url,true).query); console.log('get a request for ' + imgUrl);if (imgUrl == null || imgUrl == "" || imgUrl == undefined) {console.log('end');res.end();return;}var parsedUrl = url.parse(imgUrl);// 这里暂时使用图片服务器主机名做Referervar referrer = parsedUrl.protocol + '//' + parsedUrl.host; console.log('referrer ' + referrer);var options = {uri: imgUrl,headers: {'Referer': referrer}};function callback(error, response, body){if (!error && response.statusCode == 200) {console.log("type " + response.headers['content-type']);}res.end(response.body);}// request(options, callback);request(options).on('error', function(err){console.log(err)}).pipe(res);});module.exports = router;
2.5 优化
这部分主要是防盗链部分的优化。
单就 Referer 来说,使用空值和主机名都只能满足部分需求。
一个优化方式是组合,当一种方式不能突破即采用另一种方式。
这种方式的有点在于扩大了适用面积,并且方法对任何场景比较通用。
一个优化方式是接口请求参数带源引用连接。这种方式对很多人来说不太通用,因为很多场景下并不清楚源引用连接在哪。但是对我的插件来说非常适用,插件本身保留了源引用。因此可以很好的绕过防盗链限制。
服务器作防盗链图片中转,Node.js 上手项目简明教程相关推荐
- 区块链】利用Node.js开发与合约交互的Web界面
区块链]利用Node.js开发与合约交互的Web界面 2018-03-11 16:10:37 宣之于口 阅读数 6128 收藏 更多 分类专栏: 区块链 区块链学习笔记 版权声明:本文为博主原创文章 ...
- 使用PHP破解防盗链图片的一个简单方法
这篇文章主要介绍了使用 有自己的主机一般都会设计"防盗链", 其实包括图片防盗链,和下载防盗链等,如: 1.使用.htaccess设置防盗链 RewriteEngine on Re ...
- 爬取防盗链图片福利你懂得
爬取防盗链图片 import urllib.request from lxml import etree import time import osheaders = {'User-Agent': ' ...
- 单机十万并发HLS直播服务器的防盗链技术
单机十万并发HLS直播服务器的防盗链技术 本文主要介绍基于HLS直播服务器的十万并发防盗链实现 录制切片服务器 HTTP 服务器 (nginx) LuaLib 录制切片服务器 录制切片服务器负责把直播 ...
- Node.js 官网入门教程(二) npm(安装、包版本、卸载、npx)、package.json(scripts、devDependencies)package-lock.json(语义版本规则符号
Node.js 官网入门教程(二) npm(包管理.安装.包版本.卸载.npx).package.json(scripts.devDependencies).package-lock.json(语义版 ...
- 基于Node.js平台的Express教程
基于Node.js平台的Express教程 Express 简介 什么是 Express Express 能做什么 Express 的基本使用 安装 Express 创建基本的 Web 服务器 监听 ...
- 过去一年25个amazing node.js 开源项目(2018版本)
2019独角兽企业重金招聘Python工程师标准>>> 过去一年25个令人惊奇的node.js开源项目(2018版本) 过去一年, 我们已经比较了近4,700个Node.js开源项目 ...
- Node.js的认识(初级教程)
Day01: 初识Nodejs 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径... 目标 掌握Node.js的基本概念: 了解Node.js在前端和后端领域中的作用 导入 ...
- vue+node.js+mysql项目搭建
前言 用vue搭建前端页面.用node开发后端接口.数据库用mysql 可行性分析 缺点: nodejs单线程,不能做cpu密集型操作,导致时间片不能释放,阻塞后面的任务. nodejs可靠性比较低, ...
最新文章
- Java强引用、软引用、弱引用、虚引用的区别
- Boost:boost::atomic用法实例
- 安卓编程用什么软件_震惊!安卓IOS都可以用的牛逼软件
- 文献记录(part42)--An end-to-end framework for unconstrained monocular 3D hand pose estimation
- centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)
- 火山引擎进军云市场,计划未来三年服务十万客户
- POJ 1721 CARDS(置换群)
- csgo天津服务器维护怎么办,CSGO华北赛区在天津落下帷幕
- 德鲁伊 oltp oltp_深入研究内存中OLTP表的非聚集索引
- 最基本的01背包问题
- java中do_while求阶乘倒数和,下面的程序是用do_while语句计算10的阶乘。请在程序的......
- Running Hero.
- 各省份的车牌简称 备案地区的简称
- H264码流中SPS PPS SEI概念及详解
- 十大热门职位公布 高薪行业一目了然
- Java大鱼吃小鱼游戏,今天你吃了吗?
- java倒序查询数据库_数据库 倒序查询
- GPS理论知识NMEA 0813协议
- VMware安装安卓模拟器
- 磁盘体系结构和磁盘阵列技术(RAIDLVM)及分区实践
热门文章
- Typecho重大漏洞
- ❤️保姆级!超详解!远程连接Linux虚拟机!❤️
- 工控服务器什么作用,服务器与工控机的用处和区别在哪?
- 抖音小店无货源选品技巧分享,都是最简单的选品方法,一学就会
- 微信小程序那点事儿(必看踩坑实用解决BUG)------持续更新(2)
- 技术分享 | 无人驾驶汽车的眼睛
- 安装ubuntu18.04之后遇到的问题,及运行ROS-Academy-for-Beginners遇到的问题
- 渡过“去小米化”阵痛期,华米科技能否自立?
- cydia服务器未响应,cydia错误常见问题解决办法汇总
- 记录春运返乡人员回家过程 快手服务“暖心返乡车队”