Spring Boot如何实现防盗链

一、什么是盗链

盗链是个什么操作,看一下百度给出的解释:盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。


术语听得有点迷糊?那我们简单的举个栗子:平时我们在TX网看新闻,里边有很多劲爆的图片、视频资源,每天吸引上亿的用户活跃浏览,赚着大把的广告费。


有一天一个穷比的程序员也想建一个自己的网站吸引用户赚广告费,但苦于自己没有资源,他灵光一闪盯上了TX网,心想:要是把它的资源为我所用,这样就能借助TX的资源为自己赚钱。于是他通过爬虫等一些列技术手段,把TX网资源拉取到自己的网站上,绕过了TX网的展示页面直接呈现给用户,达到了自己不提供资源又能赚钱的目的。

而如此做法却严重的损害了TX网的利益,不仅分流了大量用户,而且由于小富网的大量间接资源请求,大大增加TX网服务器及带宽的压力。TX网的网安部门在知晓这一事情后决定封杀这类空手套白狼的站点,终于祭出防盗链系统。


上边我们简单的举例说了什么是网站的盗链,再总结的简单点就是小站点盗取大站点资源以此来获利的一种行为。既然有人盗就会有人防盗,接下来在看看怎么防止盗链。

二、如何防盗链

防盗链在google,新浪,网易,天涯等,内容为主的网站应用的比较多,毕竟主要靠资源内容赚钱的嘛。


提到防盗链的实现原理得从HTTP协议说起,上边我们说过设置防盗链以后,会对 “除了在TX网本站以外发起的资源请求全部封杀”,那么问题来了,如何识别一个请求URL是从哪个站点发出的呢?

熟悉HTTP协议的小伙伴应该知道,在HTTP协议头里有一个叫referer的字段,通过referer 告诉服务器该网页是从哪个页面链接过来的,知道这个就好办了,只要获取 referer 字段,一旦检测到来源不是本站即进行阻止或者返回指定的页面。


防盗链的核心理念:尽量做到不让外站获取到我的资源,即便能通过一些手段获取到资源,也让你的获取过程异常繁琐复杂,无法实现自动化处理,或者干脆就给你有问题的资源恶心死你。做防盗链的方法比较多,基于HTTP协议头的referer属性也只是其中一种,下边我们来分析几种实现防盗链的方法。

2.1 基于HTTP协议的referer

基于HTTP协议中的 referer做防盗链,可以从网关层或者利用AOP、Filter拦截器实现。

使用Nginx在网关层做防盗链,目前是最简单的方式之一。通过拦截访问资源的请求,valid_referers 关键字定义了白名单,校验请求头中referer地址是否为本站,如不是本站请求,rewrite 转发请求到指定的警告页面。在 server 或者 location 配置模块中加入:valid_referers none blocked,其中 none : 允许没有http_refer的请求访问资源(比如:直接在浏览器输入图片网址);blocked : 允许不是http://开头的,不带协议的请求访问资源。

[root@server1 nginx]# vim conf/nginx.conflocation / {root /web;index index.html;}location ~* \.(gif|jpg|png|jpeg)$ {root /web;valid_referers none blocked www.chengxy-nds.top;if ($invalid_referer){#return 403;rewrite ^/ https://img-blog.csdnimg.cn/20200429152123372.png;}}server {listen 80;server_name www.chengxy-nds.top;location / {root /bbs;index index.html;}}[root@server1 nginx]# systemctl restart nginx

这种实现可以限制大多数普通的非法请求,但不能限制有目的的请求,因为可以通过伪造referer信息来绕过。另一种是使用Filter拦截器方式。

public class MyFilter implements Filter {@Overridepublic void doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;String referer = req.getHeader("referer");if (referer == null || !referer.contains(req.getServerName())) {req.getRequestDispatcher("XXX.jpg").forward(req, res);} else {chain.doFilter(request, response);}}
}

可以看到,Filter拦截器的实现方式更加简单,拦截指定请求URL,拿到HttpServletRequest 中 referer值比对是否为本站。

2.2 登录验证,禁止游客访问

登录验证这种就属于一刀切的方式,一般在论坛、社区类网站使用比较多,不管你发起请求的站点是什么,到我这先登录,没登录请求直接拒绝,简单又粗暴。

2.3 图形验证码

图形验证码是一种比较常规的限制办法,比如:下载资源时,必须手动操作验证码,使爬虫工具无法绕过校验,起到保护资源的目的。


当然,实现防盗链的方式还有很多,这里就不一一列举了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/487619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity入门(了解生命周期)

目录 1.新建Script(给物体添加C#代码) 2.Unity常用的生命周期介绍 1.新建Script(给物体添加C#代码) 首先点击物体,选择Add Component 搜索 New Script,自命名添加这里命名为PlayerController 2.打开Pla…

【OpenCV】图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值,则会被赋为一个值(可能为白色),否则会赋为另一个值(可能为黑色)。使用的函数是 cv.threshold。第一个参数是源图像,它应该是灰度图像。第二…

神经网络中的过拟合问题及其解决方案

目录 ​编辑 过拟合的定义与影响 过拟合的成因 1. 模型复杂度过高 2. 训练数据不足 3. 训练时间过长 4. 数据特征过多 解决方案 1. 数据增强 2. 正则化 3. Dropout 4. 提前停止 5. 减少模型复杂度 6. 集成学习 7. 交叉验证 8. 增加数据量 9. 特征选择 10. 使…

Redis篇-4--原理篇3--Redis发布/订阅(Pub/Sub)

1、概述 Redis 发布/订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,允许客户端订阅一个或多个通道(channel),并接收其他客户端发布到这些通道的消息。 2、Redis 发布/订阅的主要概…

ubuntu 7z解压rar文件报错:unsupported method message

问题说明 最近项目需要支持线上上传rar格式,7z来解压缩入库。开发测试过程中发现使用以下命令解压报错, 7z x FileImportTest01.rar -p"123456" -o/home/download -y文件目录内容已列出,但无法解压文件!!! 仔细检查命令没有问题…

流网络等价性证明:边分解后的最大流保持不变

流网络等价性证明:边分解后的最大流保持不变 问题描述证明思路伪代码C 代码实现解释问题描述 在流网络中,证明将一条边分解为两条边所得到的是一个等价的网络。具体来说,假设流网络 $ G $ 包含边 $ (u, v) $,我们以如下方式创建一个新的流网络 $ G’ $: 创建一个新结点 $…

编译问题 fatal error: rpc/rpc.h: No such file or directory

在编译一些第三方软件的时候,会经常遇到一些文件识别不到的问题,这里整理下做个归总。 目前可能的原因有(排序分先后): 文件不存在;文件存在但路径识别不了;…… 这次以常见的编译lmbench测试…

小皮面板(PHPSTUDY)配置多个域名或IP

问题描述 小皮面板默认采用nginx的静态部署,按照使用nginx的习惯只需要额外添加一个server即可,但是会发现直接往配置文件里添加新的server是不生效的,小皮的官网论坛几乎已经停止维护,因此资料较少,原本也没有仔细使…

《AI行政管理:开启高效治理新时代》

一、引言 AI 行政管理能力的定义和重要性 AI 行政管理能力是指人工智能在行政管理领域的应用能力。它涵盖了多个方面,包括政府决策支持、公共服务优化、行政流程自动化、社会治理与公共安全以及政府内部管理等。在当今时代,AI 行政管理能力具有至关重要…

Golang使用etcd构建分布式锁案例

在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统。分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要。它有助于维护一致性,防止竞争条件,并确保在任何给定时间只有一个进程独占访问资源。 我们将使用Go作为编程语言&am…

数字IC后端实现常见的physical only cell都有哪些?如何添加这些cell?

数字IC后端实现阶段常见功能cell有哪些?比如AND,AOI,NAND等。 physical cell有哪些?都是干什么用的? 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 (1) well tap cells:防止…

【NVIDIA orin nx 安装ultralytics yolov11】

注意:不同用户安装的python可能会在不同的路径,因此不同的pip管理会导致安装的 torch和torchvision会在不同的路径下 记得区分用户来运行yolo 一、确认系统 JetPack 版本 此处使用5.1.1 1、查看JetPack 版本 jtop二、安装 ultralytics、pytorch、torchvision、onnxruntime…

CANDENCE:过孔设置 及 如何放置过孔

过孔设置 1、 2、 3、弹出如下对话框 4、选择需要的过孔尺寸,双击 5、调节过孔优先级 6、点击 ”OK“ 完成设置 放置过孔 及 过孔选择 在PCB设计窗口 切换到走线模式 走线时,侧边栏可以选择过孔尺寸 选择好后, 双击左键放置过孔 也…

React 和 Vue _使用区别

目录 一、框架介绍 1.Vue 2.React ?二、框架结构 1.创建应用 2.框架结构 三、使用区别 1.单页面组成 2.样式 3.显示响应式数据 4.响应式html标签属性 5.控制元素显隐 6.条件渲染 7.渲染列表 react和vue是目前前端比较流行的两大框架,前端程序员应该将…

基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究|文献速递-生成式模型与transformer在医学影像中的应用速递

Title 题目 Mammography classification with multi-view deep learning techniques:Investigating graph and transformer-based architectures 基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究 01 文献速递介绍 乳腺X线检查是乳腺癌…

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节,尤其在涉及数据库的应用时,良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践,结合 C 与 SQL 的实际应用场景,涵盖项目需求收集、数据库设…

【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)

文章目录 TCP/IP协议族ARPDNS标志字段:协商具体的通信方式和反馈通信状态DNS查询问题的格式资源记录(Resource Record, RR)格式:被用于应答字段、授权字段和额外信息字段 IP协议IP服务的特点无状态无连接不可靠 IP头部结构IPv4头部…

GO并发编程

一、并发编程初体验和问题 关于 Go 语言和线程的关系 Go 语言中存在线程。Go 语言的并发模型是基于 Goroutine、Processor(P)和 Machine(M,操作系统线程)的 GMP 模型。Goroutine 是 Go 语言中轻量级的执行单元&#xf…

初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容

uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下,有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”,但是我的小程序结构没问题,并且真机预览没有问题 真机调试 根据defi…

车载语音的台架和实车测试分析

在车载测试过程中免不了要对一些特殊的业务进行深度的专项测试。比如语音识别,这个技术在汽车上也不算什么新技术,但是涉及到用户的使用,更加涉及操作的安全性,所以这块测试还是很重要的。 那么要做好语音识别的业务专项测试&…