node实现防盗链
什么是防盗链
盗链,顾名思义就是盗窃链接,就是在他人未经允许的情况下,去使用他人站点的任何图片,视频,内容等资源,来借此提升已用的站点的活跃度,严重损坏了别人的利益。那么防盗链就是采用一些办法阻止自己的资源被盗用。
模拟图片防盗链
一般情况下图片防盗链居多,我们来看看图片防盗链是如何做出来的。
<body>
<h3>哈哈哈哈哈</h3>
<img src="http://c.hiphotos.baidu.com/image/w%3D210/sign=ed30880babec8a13141a50e1c7029157/d52a2834349b033be1a9503e17ce36d3d539bd35.jpg" alt="">
</body>
分两种形式展示
- 本地file直接打开index.html

- 本地起一个服务,模拟站点,打开index.html

由此可见,没有起服务时显示的是正常的图片,起了服务后就变了另一张图片,这就是百度对图片做了防盗链处理。
从这个可以得出一个结论,所谓的防盗链处理是针对与服务器上而言的,file起的页面是无效的
实现防盗链
据查阅资料可知,防盗链是可以通过Host和Referer进行比较来实现的,下面用node实现一个防盗链
1 准备两种图片,一个正常下载的图片的,一个为了防盗而显示的图片。
2 准备一个域名,为了模拟服务器。
host文件 更改127.0.0.1 www.sqh17.com
2 实现
思路:
- 创建http的server
- 首先读取文件,判断文件是否存在
- 判断referer和host是否一致,不一致则进行图片
- 启动服务
代码
index.html文件<body>
<h3>哈哈哈哈哈</h3>
<img src="http://www.sqh17.com:8888/2.png" alt="">
</body>
js文件
let fs = require('fs');
let path = require('path');
let http = require('http');
let url = require('url');
let static = path.resolve(__dirname, "public"); // 静态资源目录
let server = http.createServer((req, res) => {
let referer = req.headers['referer'] || req.headers['referered']; // 兼容性处理 let pos = path.join(static, url.parse(req.url).pathname); // 处理成绝对路径
fs.stat(pos, err => { // 先判断文件存不存在
if (!err) {
if (referer) { // 当存在referer
let refererHost = url.parse(referer).hostname; // referer地址
let host = req.headers['host'].split(':')[0]; // host地址 if (refererHost !== host) {
// 若不一致,则替换图片
fs.createReadStream(path.join(static, '/fail.png')).pipe(res);
} else {
fs.createReadStream(pos).pipe(res);
}
} else {
// 第一次index.html的显示
fs.createReadStream(pos).pipe(res);
}
} else {
res.end("Not Found");
}
}); })
server.listen('8888', () => {
console.log('服务器开启成功', '端口:8888');
})
演示
当地址栏上的地址是http://www.sqh17.com:8888/index.html时,显示的是正常的图片


当地址栏上的地址是http://localhost.com:8888/index.html时,显示的是防盗链的图片


总结
防盗链的方式有很多,利用referer和host的比较来实现防盗链是其中的一种,上述方式虽然很简单,但是是提供了一种思路,方便为自己以后的网站搭建。
本文若有什么不对的地方,欢迎大家提出来,一起进步,我把例子和文档放到了GitHub上,欢迎查阅
node实现防盗链的更多相关文章
- Node.js——防盗链
防盗链可以通过判断请求头中携带的referrer是否属于本域名
- WEB服务器防盗链_HttpAccessKeyModule_Referer(Nginx&&PHP)
盗链的概念指在自己的页面上展示一些并不在自己服务器上的内容.也就是获得他人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容.如,小站盗用大站的图片.音乐.视频.软件等 ...
- JAVA防盗链在报表中的应用实例
今天我们来聊聊Java防盗链,多说无用,直接上应用案例. 这里所用的工具是报表软件FineReport,搭配有决策系统(一个web前端展示系统,主要用于权限控制),可以采用java防盗链的方式来实现页 ...
- nginx secure_link下载防盗链
下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷.flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效 ...
- Nginx中防盗链(下载防盗链和图片防盗链)操作记录
日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...
- Code笔记 之:防盗链(图片)
图片防盗链 参考:http://bbs.csdn.net/topics/330080045 应该是”10种图片防盗的方法“,而不是”10种图片防盗链的方法“,不过看搜索防盗链的人要多一点,所 ...
- nginx配置图片防盗链
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 30d; access_log off; valid_referers none blocked ...
- php中防盗链使用.htaccess
下面开始讲解:比如你的图片都在img目录下,那就在该目录下放一个名为 .htaccess 的文件,内容如下: php代码: 以下为引用的内容:RewriteEngine onRewriteCond % ...
- 使用Apache的.htaccess就可以防盗链
Apache的.htaccess可以实现很多功能,如密码保护.禁止显示目录列表.阻止/允许特定的IP地址.实现网址的301 重定向等等.本文就来说说使用Apache的.htaccess如何防盗链. 当 ...
随机推荐
- json 的基础入门
JSON是什么: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.在初始的项目开发中人们更倾向于使用xml来进行数据的传输,但当JSON出现后,开发者更倾 ...
- centos下配置Nginx
首先NGINX是一个高效的HTTP和反向代理的服务器,这里记录一下它的安装方式和文件结构方便以后查看.同时Linux系统具有灵活性,其他的东西可查看具体的官网信息:https://nginx.org/ ...
- Uniapp使用GoEasy实现websocket实时通讯
Uniapp作为近来最火的移动端开发技术,一套代码,可以打包成Android/iOS app和各种平台的小程序,可谓是没有最方便只有更方便. GoEasy上架DCloud Uniapp插件市场已经有一 ...
- CAS无锁模式
一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...
- vue one
目录 复习 Vue框架 Vue的优点 Vue的使用 vue完成简单的事件 vue操作简单样式 小结 指令 文本指令 事件指令 属性指令 条件指令 复习 """ 1.BBS ...
- 在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式
(一)MySQL多实例概述 实例是进程与内存的一个概述,所谓MySQL多实例,就是在服务器上启动多个相同的MySQL进程,运行在不同的端口(如3306,3307,3308),通过不同的端口对外提供服务 ...
- Java日期处理易踩的十个坑
前言 整理了Java日期处理的十个坑,希望对大家有帮助. 一.用Calendar设置时间的坑 反例: Calendar c = Calendar.getInstance(); c.set(Calend ...
- [暴力枚举]Codeforces Vanya and Label
Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 简单理解vertical-align属性和基线问题
vertical-align属性主要用于改变行内元素的对齐方式,对于行内布局影响很大,如果不了解的话,我们开发调整样式的时候很容易出错. 网上关于这个属性的原理说得很是复杂,看一眼就让人觉得望而生畏, ...
- 基于Java的数字货币交易系统的架构设计与开发
前言 无论是股票交易系统,还是数字货币交易系统,都离不开撮合交易引擎,这是交易平台的心脏.同时,一个优秀的架构设计也会让交易平台的运维和持续开发更加容易.本文基于对开源项目的深入研究,总结了数字货币交 ...