文/李信栋
前几天随手写的 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 上手项目简明教程相关推荐

  1. 区块链】利用Node.js开发与合约交互的Web界面

    区块链]利用Node.js开发与合约交互的Web界面 2018-03-11 16:10:37 宣之于口 阅读数 6128  收藏 更多 分类专栏: 区块链 区块链学习笔记 版权声明:本文为博主原创文章 ...

  2. 使用PHP破解防盗链图片的一个简单方法

    这篇文章主要介绍了使用 有自己的主机一般都会设计"防盗链", 其实包括图片防盗链,和下载防盗链等,如: 1.使用.htaccess设置防盗链 RewriteEngine on Re ...

  3. 爬取防盗链图片福利你懂得

    爬取防盗链图片 import urllib.request from lxml import etree import time import osheaders = {'User-Agent': ' ...

  4. 单机十万并发HLS直播服务器的防盗链技术

    单机十万并发HLS直播服务器的防盗链技术 本文主要介绍基于HLS直播服务器的十万并发防盗链实现 录制切片服务器 HTTP 服务器 (nginx) LuaLib 录制切片服务器 录制切片服务器负责把直播 ...

  5. Node.js 官网入门教程(二) npm(安装、包版本、卸载、npx)、package.json(scripts、devDependencies)package-lock.json(语义版本规则符号

    Node.js 官网入门教程(二) npm(包管理.安装.包版本.卸载.npx).package.json(scripts.devDependencies).package-lock.json(语义版 ...

  6. 基于Node.js平台的Express教程

    基于Node.js平台的Express教程 Express 简介 什么是 Express Express 能做什么 Express 的基本使用 安装 Express 创建基本的 Web 服务器 监听 ...

  7. 过去一年25个amazing node.js 开源项目(2018版本)

    2019独角兽企业重金招聘Python工程师标准>>> 过去一年25个令人惊奇的node.js开源项目(2018版本) 过去一年, 我们已经比较了近4,700个Node.js开源项目 ...

  8. Node.js的认识(初级教程)

    Day01: 初识Nodejs 知道nodejs是一个js运行环境,借助各种模块,它可以读写文件,处理路径... 目标 掌握Node.js的基本概念: 了解Node.js在前端和后端领域中的作用 导入 ...

  9. vue+node.js+mysql项目搭建

    前言 用vue搭建前端页面.用node开发后端接口.数据库用mysql 可行性分析 缺点: nodejs单线程,不能做cpu密集型操作,导致时间片不能释放,阻塞后面的任务. nodejs可靠性比较低, ...

最新文章

  1. Java强引用、软引用、弱引用、虚引用的区别
  2. Boost:boost::atomic用法实例
  3. 安卓编程用什么软件_震惊!安卓IOS都可以用的牛逼软件
  4. 文献记录(part42)--An end-to-end framework for unconstrained monocular 3D hand pose estimation
  5. centos7 关闭selinux_Devops之LDAP部署安装(centos7+openLDAP+PhpLDAPAdmin)
  6. 火山引擎进军云市场,计划未来三年服务十万客户
  7. POJ 1721 CARDS(置换群)
  8. csgo天津服务器维护怎么办,CSGO华北赛区在天津落下帷幕
  9. 德鲁伊 oltp oltp_深入研究内存中OLTP表的非聚集索引
  10. 最基本的01背包问题
  11. java中do_while求阶乘倒数和,下面的程序是用do_while语句计算10的阶乘。请在程序的......
  12. Running Hero.
  13. 各省份的车牌简称 备案地区的简称
  14. H264码流中SPS PPS SEI概念及详解
  15. 十大热门职位公布 高薪行业一目了然
  16. Java大鱼吃小鱼游戏,今天你吃了吗?
  17. java倒序查询数据库_数据库 倒序查询
  18. GPS理论知识NMEA 0813协议
  19. VMware安装安卓模拟器
  20. 磁盘体系结构和磁盘阵列技术(RAIDLVM)及分区实践

热门文章

  1. Typecho重大漏洞
  2. ❤️保姆级!超详解!远程连接Linux虚拟机!❤️
  3. 工控服务器什么作用,服务器与工控机的用处和区别在哪?
  4. 抖音小店无货源选品技巧分享,都是最简单的选品方法,一学就会
  5. 微信小程序那点事儿(必看踩坑实用解决BUG)------持续更新(2)
  6. 技术分享 | 无人驾驶汽车的眼睛
  7. 安装ubuntu18.04之后遇到的问题,及运行ROS-Academy-for-Beginners遇到的问题
  8. 渡过“去小米化”阵痛期,华米科技能否自立?
  9. cydia服务器未响应,cydia错误常见问题解决办法汇总
  10. 记录春运返乡人员回家过程 快手服务“暖心返乡车队”