Spring Boot如何实现防盗链

news2025/1/11 10:04:23

一、什么是盗链

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


术语听得有点迷糊?那我们简单的举个栗子:平时我们在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.conf


      location / {
            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 {
    @Override
    public 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.coloradmin.cn/o/2256957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.内容管理模块-课程查询

搞清楚一个项目的业务流程最直接的手段,就是找一个账号登录进去,操作一遍。 3.3设计接口 接口设计分析 post在需要提交很多参数的时候使用,并且post的安全性较高。 接口分析: po包,一般存放和数据库交互的实体类。 …

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一,它为互联网上的数据传输提供了可靠性和连接管理。 TCP(Transmission Control Protocol,传输控制协议…

vue3组件间传值

definProps方式 子组件&#xff1a;assignSuppliers.vue const propdefineProps({fid:String}); 父组件&#xff1a;index.vue <!-- 供应商分配 --><n-drawerwidth"800"v-model:visible"drawerSupplierConfig.visible":title"drawerSuppli…

《网络安全编程基础》之Socket编程

我的代码 server.c // server.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件 void main(int argc,char* argv[]) {WSADATA …

不只是请求和响应:使用Fiddler解读Cookie与状态码全指南(下)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)_fiddler 获取响应脚本-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5501 不只是请求和响…

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…

Python 类的设计(以植物大战僵尸为例)

关于类的设计——以植物大战僵尸为例 一、设计类需满足的三要素1. 类名2. 属性和方法 二、以植物大战僵尸的为例的类的设计1. 尝试分类2. 创建对象调用类的属性和方法*【代码二】*3. 僵尸的继承 三、代码实现 一、设计类需满足的三要素 1. 类名 类名&#xff1a;某类事物的名…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…

记录ubuntu22.04重启以后无法获取IP地址的问题处理方案

现象描述&#xff1a;我的虚拟机网络设置为桥接模式&#xff0c;输入ifconfig只显示127.0.0.1&#xff0c;不能连上外网。&#xff0c;且无法上网&#xff0c;用ifconfig只有如下显示&#xff1a; 1、sudo -i切换为root用户 2、输入dhclient -v 再输入ifconfig就可以看到多了…

异步操作,promise、axios

一、异步操作&#xff08;异步编程&#xff09;、同步操作 异步操作是指在编程中&#xff0c;某个任务的执行不会立即完成&#xff0c;同时不会阻塞后续代码的执行。在异步操作中&#xff0c;程序可以继续运行&#xff0c;并在异步任务完成时得到通知并处理结果。这与同步操作…

第一性原理构造医疗信创域高质量发展路径应用探析

门诊电子病历录入 摘要&#xff1a; 主要介绍了第一性原理在医疗系统开发中的应用及其重要性。阐述了第一性原理的概念及发展历程&#xff0c;并指出其在各个领域的重要性和应用价值。详细分析了第一性原理在医疗系统开发中的具体影响&#xff0c;包括对医院管理和互联网医疗的…

MySQL8下载安装教程

前言 1.个人经验&#xff0c;仅供参考&#xff01;&#xff01;&#xff01; 2.如果之前有下载过MySQL&#xff0c;请检查是否有删除干净&#xff0c;在控制面板删除最好 下载网址&#xff1a;MySQL :: MySQL Community Downloads 下载步骤 进入网址选择要下载的 下一步网…

算法日记 45 day 图论(并查集基础)

并查集解决什么问题 并查集常用来解决连通性问题。 大白话就是当我们需要判断两个元素是否在同一个集合里的时候&#xff0c;我们就要想到用并查集。 原理 既然是查找是否在同一个集合中&#xff0c;那么这个集合是怎么构建的呢&#xff1f;用一维数组来表示一个有向图&…

PTA DS 6-4 带头结点的链队列的基本操作 (C补全函数)

6-4 带头结点的链队列的基本操作 分数 10 全屏浏览 切换布局 作者 黄复贤 单位 菏泽学院 实现链队列的入队列及出队列操作。 函数接口定义&#xff1a; Status QueueInsert(LinkQueue *Q,ElemType e)&#xff1b; Status QueueDelete(LinkQueue *Q,ElemType *e)&#x…

Windows 系统没有网络链接常见原因以及解决方案

在使用 Windows 电脑时&#xff0c;有时会遇到电脑显示已连接网络&#xff0c;但却无法访问 Internet 的情况&#xff0c;这可能是由多种原因导致的。以下简鹿办公将详细介绍一些常见原因及对应的解决方案。 一、网络连接问题 原因 路由器故障&#xff1a;路由器长时间运行可…

lnmp+discuz论坛 附实验:搭建discuz论坛

Inmpdiscuz论坛 Inmp: t: linux操作系统 nr: nginx前端页面 me: mysql数据库 账号密码&#xff0c;等等都是保存在这个数据库里面 p: php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#xff0c;通过php把动态请求转发到数据库 n…

杨振宁大学物理视频中黄色的字,c#写程序去掉

先看一下效果&#xff1a;&#xff08;还有改进的余地&#xff09; 我的方法是笨方法&#xff0c;也比较刻板。 1&#xff0c;首先想到&#xff0c;把屏幕打印下来。c#提供了这样一个函数&#xff1a; Bitmap bmp new Bitmap(640, 480, PixelFormat.Format32bppArgb); // 创…

Openlayers基础知识回顾(五)

1、GeoJSON数据的加载 GeoJSON是一种基于JSON的地理空间数据交换格式&#xff0c;它定义了几种类型JSON对象以及它们组合在一起的方法&#xff0c;以表示有关地理要素、属性和它们的空间范围的数据 2、GeoJSON转化为ol要素 new ol.format.GeoJSON().readFeatures() 一、canv…