NodeJS 服务器实现资源防盗链

图片视频等资源中转,用nodejs解决防盗链问题 express 解决方法 index.js部分 const express = require('express'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const app = express(); //根据不同的功能 划分模块 (动态) a... 阅读详情

在这里插入图片描述


阅读原文


什么是 “盗链”?

“盗链” 说白了就是利用别人网站的资源链接放在自己的站点,在未经允许的情况下去获取别人网站里面的图片或者视频等资源,导致资源所有者的网站的流量费用增加或收入减少,为了防止资源链接随意被人盗用的手段被称为 “防盗链”。


模拟 “盗链” 场景

我们先来模拟一下 “盗链” 场景,在本地启动服务运行 hotlinking.html 文件,并在文件中盗用百度视频的图片资源,看看效果。

<!-- 文件:hotlinking.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>盗链</title>
</head>
<body>
    <img src="http://c.hiphotos.baidu.com/video/pic/item/e61190ef76c6a7ef8891a7c9f1faaf51f2de66ad.jpg">
</body>
</html>

我们通过 http-server 来启动服务器访问 hotlinking.html,使用 http-server 需全局安装。

http-server install -g

在服务中打开 hotlinking.html 后我们发现图片并不是我们盗用链接的资源,而是变成了下面这张图片。

在这里插入图片描述

这张图用来提醒我们盗用了别人资源,是因为百度的服务器做了防盗链处理,如果所有盗用别人的资源都变成这样,盗用也就没有实际意义了,我们本篇就通过 NodeJS 来实现防盗链处理,用来保护自己站点的资源。

注意:具备防盗链处理的网站的资源链接可以直接通过浏览器地址栏访问,也可以在文件域(file 协议)访问,限制的是在未经允许的情况下其他服务器的访问。


NodeJS 服务器实现防盗链

1、模拟两个域名

在本地的 hosts 文件中加入两个域名:

127.0.0.1          panda.com
127.0.0.1          shen.com

2、准备图片资源

在根目录创建文件夹 public 并存入两张图片,success.png 是正常请求的图片资源,error.png 是经过防盗链处理后返回的图片资源,两张图片如下。

正常返回的图片资源 success.png:

在这里插入图片描述

防盗链处理后返回的图片资源 error.png:

在这里插入图片描述

3、页面 index.html

在页面当中通过 img 标签分别访问 shen.com、panda.com 和 localhost 域下的 success.png 文件。

<!-- 文件:index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>盗链</title>
</head>
<body>
    <img src="http://panda.com:3000/success.png">
    <img src="http://shen.com:3000/success.png">
    <img src="http://localhost:3000/success.png">
</body>
</html>

4、服务端 server.js

在写服务端代码之前需要介绍两个重要的请求头:

  • host:资源所在的域
  • referer:请求来源的域

其实资源防盗就是设置白名单,通过检测 referer 是否在白名单中,如果在则正常返回资源,不存在则返回经过防盗链处理的资源。

注意:referer 请求头在地址栏输入地址时发送的请求是不存在的(如请求 index.html 页面),在旧版本的 HTTP 协议中 referer 的写法为 referered,所以为了兼容旧版本协议应该做兼容处理。

// 文件:server.js
// 引入依赖
const http = require("http");
const url = require("url");
const path = require("path");
const fs = require("mz/fs");

const server = http.createServer(responseImages); // 创建服务器
let static = path.resolve(__dirname, "public"); // 静态资源目录
let whiteList = ["shen.com"]; // 白名单

async function responseImages(req, res) {
    // 解析 url 中的文件目录处理成绝对路径
    let p = path.join(static, url.parse(req.url).pathname);

    // 检测文件路径是否合法,不合法直接返回 Not Found
    let isExist = await fs.exists(p);

    if (isExist) {
        // 获取 referer
        let refer = req.headers["referer"] || req.headers["referered"];

        // 存在 referer 继续检测
        if (refer) {
            // 请求资源存在 referer,做防盗链处理
            let referHost = url.parse(refer).hostname;
            let host = req.headers["host"].split(":")[0];

            // 当访问源的域和资源所在的域不是同一个域,做防盗链处理
            if (referHost !== host) {
                let isInWhiteList = whiteList.includes(refer);
                p = isInWhiteList ? p : path.join(static, "error.png");
            }
        }

        // 第一次访问请求页面 index.html,不存在 referer,将静态资源返回
        // 第二次访问请求图片资源,如果 referer 和资源所本就是同一个域,直接将资源返回
        fs.createReadStream(p).pipe(res);
    } else {
        res.statusCode = 404;
        res.end("Not Found");
    }
}

server.listen(3000, () => {
    console.log("server start 3000");
});

其实上面的服务器是 shen.com、panda.com 和 localhost 所共用的,只是通过不同的域名访问。

启动服务器,然后通过 localhost:3000 访问,此时由于与 shen.com 和 panda.com 为不同域,所以只有第三张图片返回 success.png。

通过 shen.com:3000 访问,由于存在白名单中,所以三张图片都返回 success.png。

通过 panda.com:3000 访问,由于 shen.com 在不同域,所以没有返回 success.png。

无论通过 shen.com 还是 panda.com 访问 localhost 的资源都是在同域的,所以都能获取到。


总结

在上面我们利用本地服务实现了一个最基本的防盗链,思路就是 referer 与资源同域,正常返回,不同域检测白名单,在真实的开发场景可能会更细化,更复杂一些,其实整个防盗链实现的核心就是利用 HTTP 的 referer 和 host 请求头做检测,希望通过本篇的学习,大家可以对资源防盗链有所了解,并在后面开发类似功能时提供思路。


绕开 referrer 防盗链 以及服务器nodejs 作防盗链图片中转 最近处理了一个与referer有关的需求,发现里面还是有一点门道的。因此在本篇文章整理了referer相关知识点,主要涉及图片防盗链与如何绕开防盗链限制。 参考: Referer-MDN 使用referer Referer是HTTP请求头的一个字段,包含了当前请求页面的来源页面的地址,通过该字段,我们可以检测访客是从哪里来的。 那么,referer到底有啥作用呢? 交互优化 在某些web应用的交互... 阅读详情

相关推荐

【前端运维】打通任督二脉!(nginx篇和nodejs + go)

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。

郊眠寺 881

Node.JS跨域添加自定义Header并使用

Node.JS跨域添加自定义Header并使用 为使用使用Token的方式记录用户的登录令牌,其步骤如下: 前端发出AJAX登录请求 后端通过请求,并生成Token发送回前端 前端在Header中记录此Token 第二次前端发起请求时,在Header中携带此Token令牌 后端验证请求Header中携带的Token 期间,需要在Header中创建一个项“xtoken”,将token放置于...

ZHANG DING的博客 7849

主机验证:用于“主机”和“ Referer”标头验证的Express.js中间件,可防止DNS重新绑定攻击

主机验证 Express.js中间件,可通过验证传入请求中的Host和Referer [sic]标保护Node.js服务器免受攻击。 如果请求不包含列入白名单的Host / Referer标头,则host-validation将以403 Forbidden HTTP错误响应。 DNS重新绑定是一个精明的漏洞利用,多年来一直没有得到应有的重视。 因此,由于开发人员缺乏有关攻击的知识,或者仅仅是疏忽和漠不关心该攻击,因此大量的服务容易受到攻击。 别做那个人。 入门 # install using npm npm install host-validation const express

一文带你搞懂防盗链

这个例子很好的使用了nodejs的中间件。也是nodejs中的express的一个很好的综合练习。

zxdznyy的博客 833

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 413

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

用Node.js实现防盗链功能

在这个示例中,我们通过验证请求来源URL和User-Agent头信息来判断请求是否合法。需要注意的是,防盗链并不能完全阻止恶意盗链行为,还需要结合其他安全措施来加强网站的安全性。通过验证请求的User-Agent头信息,可以判断请求是否来自浏览器或其他正常的客户端。如果请求的User-Agent头信息不合法,则可以拒绝服务。随着互联网的普及,许多网站上的内容被其他网站盗链,严重侵犯了原创者的权益。盗链是指一些网站或个人直接从其他网站获取内容,而不需要进行正常的访问请求。

wujiayu31415的博客 783

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5327

防盗链[nodejs]

【代码】防盗链[nodejs]

qq_29894575的博客 541

TeXstudio完整安装配置教程(2025最新版)

至此,你已经完成了TeXstudio的完整安装和配置!现在你可以:✅ 使用TeXstudio编写LaTeX文档✅ 正确编译中英文混排的文档✅ 掌握基本的编辑和配置技巧LaTeX的学习曲线较陡,但一旦掌握,你会发现它在学术写作中的强大之处。建议从简单的文档开始练习,逐步掌握更高级的功能。祝你LaTeX写作顺利!如果有任何问题,欢迎在评论区留言交流。关键词:TeXstudio安装、LaTeX环境配置、中文LaTeX、TeX Live、学术论文写作更新日期:2025年10月。

weixin_51241407的博客 4500

KNN算法

其原理是在给定的数据集中,根据某个距离度量方法,将测试数据与已知数据集中的所有数据进行距离计算,然后选取K个距离最近的数据作为测试数据的邻居,根据邻居的类别进行投票,将测试数据分类到得票最多的类别中。总之,KNN算法是一种简单而有效的分类方法,它不需要对数据进行训练,可以适用于多种数据类型和应用场景,并且可以通过调整K值或距离阈值等参数来控制算法的复杂度和性能。,KNN算法需要找到K个距离测试样本最近的训练样本,计算它们的类别,并将测试样本归入到得票最多的类别中。则取值为1,否则为0,表示邻居中属于类别。

优快云XXCQ的博客 2631

Nodejs 第三十章(防盗链)

防盗链(Hotlinking)是指在网页或其他网络资源中,通过直接链接到其他网站上的图片、视频或其他媒体文件,从而显示在自己的网页上。这种行为通常会给被链接的网站带来额外的带宽消耗和资源浪费,而且可能侵犯了原始网站的版权。

qq1195566313的博客 2229

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

基于NodeJS的HTTP server Plus 2:防盗链(referer)

什么是 “盗链”?“盗链” 说白了就是利用别人网站的资源链接放在自己的站点,在未经允许的情况下去获取别人网站里面的图片或者视频等资源,导致资源所有者的网站的流量费用增加或收入减少,为了防止资源链接随意被人盗用的手段被称为 “防盗链”。模拟 “盗链” 场景我们先来模拟一下 “盗链” 场景,在本地启动服务运行 hotlinking.html 文件,并在文件中盗用百度视频的图片资源,看看效果。文件:ho...

weixin_33701564的博客 1413

【STM32项目】基于AI技术的多功能消防机器人(完整工程资料源码)

机器人通过巡逻扫描环境空间与障碍物、定位导航、探测物体/环境进行建模/自动地图测绘、扫描火焰、获取温湿度大小、获取空气安全情况来判断当前环境地点是否安全,检测到温度过高或检测到易燃、烟雾、有毒气体或摄像头识别到火焰时能够通过高压水泵喷射器来实现火焰隔离工作,蜂鸣器进行现场鸣笛报警,同时将当前环境温湿度大小、空气情况、环境地图、是否安全信息,将各个传感器来接收获取到的信息,实时发送到用户手机中的微信小程序,实现与用户远程监视功能,用户同时也能通过手机与电脑远程下发命令来操控机器人来实现交互功能

嵌入式技术开发 1万+

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1)

其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。

J_Giser的博客 1832

NodeJs 第十九章 防盗链

防盗链(Hotlinking)指的是一种网站技术,用于阻止其他网站直接链接到自己的资源(如图片、音频、视频等),而是强制让访问者访问资源所在网站。防盗链的目的是保护资源的安全性和减少带宽消耗。可以通过设置服务器的HTTP头部信息来实现。服务器可以检查请求来源的HTTP头部中的Referrer字段,如果该字段为空或与自己的域名不匹配,服务器可以拒绝提供资源。还可以减少带宽消耗,因为资源只能通过原始网站访问,而不是被其他网站直接链接。有助于防止其他网站未经许可使用自己的资源,从而保护了原始网站的权益。

aXin_li的博客 867

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

笔记整理nodeJS

nodeJS 学习方法 掌握思想 ​ 编程思想很重要,语言只是工具。不仅仅只是记住了API。 查资料的方式 ​ API文档:比二阶段的API多出了3倍多。 https://blog.youkuaiyun.com/jiang7701037/article/details/95734911?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158832966919725247634022%2522%252C%2522scm%2522%

qq_44417271的博客 1591

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

由于掘金开启了防盗链,我连夜写个爬虫导出所有博客

前言事情是这样的,在写完上一篇文章后,将 markdown文件部署到了自己的服务器上,然后发现自己博客的图片全部没有了,F12一看,才发现都变成了 403。这是为啥呢?噢,原来是我之前把掘金当图床在使,狠狠得薅掘金一两年的羊毛。结果不知道啥时候突然开启了防盗链。导致了出现这个P1级事故(破站虽然没人访问)。因为我的文章都是靠图片占面积的,这么多图片一个个替换太麻烦了,所以我接下来打算将掘金上的文章...

Crazymryan的博客 1075

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

nodejs下载图片保存到本地

我们经常在使用别人图片url的时候发现图片显示不了,很可能对方做防盗链处理。在浏览器端有这个限制但是在后端就没有这个问题了。所以我们可以通过图片的url在服务端将这个图片下载下来保存在服务器上,然后客户端去访问我们自己的服务器,为了保证最小的改动,最好是保持原来url的图片路径,我们只需要换url前面的域名就可以了。分析源url,创建本地目录以及解析出新的写入路径使用mkdirSync函数同步的进行

Keep It Simple, Stupid 2万+

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

本篇文章我们学习使用 body-parser 获取请求体数据、使用 referer 头验证等方式添加防盗链、拆分路由实现其模块化,使用 express-generator 快速搭建应用等。

HuoZhiyan 的博客 1760

nodejs framework express 服务器快速开发框架

express 启动 安装npm i express -S 1:引入express第三方对象 const express = require("express"); 2:构建一个服务器对象 let server = express(); 3:开启服务器监听端口 server.listen(8080, ()=>{ console.log("启动8080端口监听"); }); 4:处理响应 server.use('/index', (req, resp)=>{ res.end("页面响应成功")

小迷糊 409

NodeJs基础入门

*历史及发展 **1995年 网景公司的布兰登开发;1997年7月,ECMA组织发布ECMAScript 1.0版;2007年10月发布3.1版本后不久,ECMAScript 3.1改名为 ECMAScript 5。2008年,为Chrome浏览器而开发的V8编译器诞生2011年6月,ECMAscript 5.1版发布,现在使用最为广泛的版本;2015年6月,ECMAScript 6正式发布,并且更名为“ECMAScript 2015”;如何学习JavaScript。

qq331697853的博客 372

Nodejs学习四(Express)

一、介绍和安装 你的应用创建一个目录,然后进入此目录并将其作为当前工作目录。 $ mkdir myapp $ cd myapp 通过 npm init 命令。此命令将要求你输入几个参数,例如此应用的名称和版本。 你可以直接按“回车”键接受大部分默认设置即可,下面这个除外: entry point: (index.js) 键入 app.js 或者你所希望的名称,这是当前应用的入口文件。如果你希望采用默认的 index.js 文件名,只需按“回车”键即可。 接下来在 myapp 目录下安装 Express 并将

Wu_JingYi0829的博客 1513

nodejs搭配express解决history 本地搭建服务器运行打包项目

nodejs搭配express解决history 安装两个包: “connect-history-api-fallback”: “^1.6.0”, //解决history “express”: “^4.17.1” //express serve.js配置 const express = require('express') const history = require('connect-history-api-fallback'); const app = express() app.use(

greed 610
上一篇: NodeJS 使用 Range 请求实现下载功能
下一篇: NodeJS 服务器数据处理(表单、json 字符串和普通字符串)
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值