你的图片又被别人“白嫖”了?用这篇Java防盗链攻略说再见!

SpringBoot三招搞定图片防盗链,再也不用担心流量被偷! 最近我的个人博客遇到一件糟心事——某天查看服务器日志,发现图片请求量暴增3倍!顺着访问记录查下去,结果发现十几个营销号网站居然直接盗用我的图片链接。每月几十G的流量就这么白白浪费,气得我连夜研究出这套SpringBoot防盗链方案,亲测有效!举个栗子🌰:你花大价钱买了云服务器,精心制作了原创图片。结果隔壁老王在他的网站直接用,用户访问老王网站时,图片加载消耗的却是你的服务器流量!这就是典型的盗链行为。防盗链核心原理: 当浏览器请求图片时,服务器会检查请求头中的字段(即来源页面地址)。如果是非法站点,直接返 阅读详情

01 引言

公司领导对数据安全非常看重,要求我们的系统中的图片链接,不能在其他地方打开,只能在系统中查看,要求我们整改系统。这玩意怎么整呀,图片资源服务器在我们公司本身就是可以对外公开访问图片的,怎么才能实现既要能访问又要不能访问呢?

防盗链是首先能想到的方案。我们今天一起来唠唠!

02 外部效果

我们先看看外部网站的效果,我们以百度图片为例:

通过查看源码,可以看到图片的具体地址:

https://ww2.sinaimg.cn/mw690/007ut4Uhly1hx4v37mpxcj30u017cgrv.jpg

但是直接访问时,却无法访问:

这就实现了图片的防盗功能。

03 防盗链的工作原理

防盗链的核心原理是检查HTTP请求头中的 Referer 字段。

  • Referer 字段表示这个请求是从哪个页面发起的。
  • 如果一张图片应该只在 www.mywebsite.com 上被访问,那么所有来自其他域名(如 www.othersite.com)的图片请求,其 Referer 字段都会是 http://www.othersite.com/somepage.html。
  • 服务器通过校验这个 Referer 值,就可以判断请求是否合法,从而决定是返回真实的图片还是一个错误/替代图片。

04 最佳实践

最高效、最常用的方式是在Web服务器层面配置,例如 Nginx。这种方式性能损耗极小。此方案不是本节讨论的重点,我们从Java开发角度取实现。

了解防盗链的工作原理之后,我们只需要通过拦截器或者过滤器,拦截指定的请求,通过Header中的Referer属性,就可以实现。

我们通过过滤器来实现,因为很多时候图片属于静态资源,而过滤去默认拦截静态资源。

4.1 创建拦截器

public class ImageReferFilter implements Filter {

    public static final String REFERER = "Referer";
    public static final String ALLOW_DOMAIN = "127.0.0.1:8080";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        String url = httpServletRequest.getRequestURL().toString();
        // 过滤图片资源
        if (StringUtils.isNotEmpty(url) && StringUtils.endsWithAny(url.toLowerCase(), ".jpg", ".png", ".gif", ".jpeg")) {
            String header = httpServletRequest.getHeader(REFERER);
            // 来自本地,就放行
            if (StringUtils.isNotEmpty(header) && StringUtils.contains(header, ALLOW_DOMAIN)) {
                chain.doFilter(request, response);
                return;
            }

            // 拦截输出403
	 		httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
			httpResponse.getWriter().write("<h1>403 Forbidden</h1><p>You don't have permission to access the URL on this server.</p>");
            return;
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }
}

输出结果可以根据自己的业务定制,如:

返回403禁止访问状态码

response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Hotlinking is not allowed.");

请求重定向到指定图片

// 假设我们在网站根目录的 /images/ 下放了一张提示图片 anti-hotlinking.jpg
String warningImagePath = "/images/anti-hotlinking.jpg";
response.sendRedirect(warningImagePath);

4.2 配置拦截器

@Bean
FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean filter = new FilterRegistrationBean();
    filter.setFilter(new ImageReferFilter());
    filter.addUrlPatterns("/*");
    return filter;
}

4.3 页面展示

我们在static下放了一张样例图,通过页面<img>标签引用图片。

4.4 启动效果展示

我们也实现了类似百度图片防盗的效果。

05 注意事项

防盗链拦截器只能解决一般情况的图片防盗,并不能保证绝对的安全。所以使用时应该注意:

  • Referer 的可伪造性:Referer 头可以被某些客户端或代理恶意修改或移除,因此防盗链机制并非绝对安全,但足以应对绝大多数普通的盗链情况。
  • 空 Referer 的处理:需要谨慎处理 Referer 为空的情况。浏览器直接输入地址、从HTTPS页面链接到HTTP资源(浏览器会屏蔽Referer)等都会导致其为空。根据你的安全要求,可以选择允许或拒绝。上述Java示例选择了允许。
  • CDN的影响:如果你使用了CDN,需要确保CDN在回源请求时不会剥离或修改 Referer 头,或者将CDN的域名也加入白名单。
  • 对用户体验的影响:确保你自己的网站不会被自己的规则所阻挡。在设置好之后,一定要全面测试自己网站的功能。
【项目实战】图片防盗链 对于那些提供图片托管服务且支持外链的网站,特别是那些服务于电商、博客、新闻媒体等需要频繁使用图片资源的平台,实现图片防盗链功能是非常必要的。它不仅能保护用户的权益,还能提升服务质量,营造健康的网络生态环境。 阅读详情

相关推荐

Spring Boot图片防盗链终极指南:三重防御体系实现零流量被盗

本文介绍了图片防盗链的核心原理与两种实现方案。针对流量劫持、版权风险和成本失控等痛点,提出Referer校验和动态令牌两种防护手段。Referer校验通过拦截器实现域名白名单控制,代码示例包含请求判断、域名提取和多重校验逻辑。动态令牌方案采用HMAC-SHA256签名算法生成有时效性的URL,通过时间戳和密钥验证请求合法性。两种方案均可有效防止图片资源被非法盗用,开发者可根据实际安全需求选择单独或组合使用。

墨夶的博客 388

图片防盗链原理及实现

防盗链原理: http标准协议中有专门的字段记录referer 1、他可以追溯到请求时从哪个网站链接过来的。 2、来对于资源文件,可以跟踪到包含显示他的网页地址是什么。 因此所有防盗链方法都是基于这个Referer字段 网上比较多的2种 一种是使用apache文件FileMatch限制,在httpd.conf中增加 ( 其实也可以将把下面的语句存成一个.htaccess文件),并

likaibk的博客 1万+

ITK-snap医学图像标注方法(超级详细)——保姆级

医学3D图像标注方法,非常详细,保姆级

jialiyk的博客 3万+

【SpringBoot】实现图片防盗链功能

出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地址后被下载。或者,不想浏览器直接访问图片链接。出于性能考虑,不想要别人的网站,拿着我们的图片链接去展示,白白消耗自己的服务器资源。故而可在springboot中,使用简单的图片防盗链规则。拦截掉一些处理。

北海_南风 901

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2106

nginx中的防盗链原理

资源盗链是指内容不在自己服务器上,而通过技术手段,绕过别人的限制,将别人的内容,比如热门的图片放到自己页面上,展示给用户,以此来盗取别人网站的流量,即蹭流量。简而言之就是用别人的东西成就自己的网站如下,分别在网上找的两个图片,可以直接在浏览器中打开这两个链接引导案例利用上面的这两个图片链接,在nginx的资源目录下,创建一个html页面,将两张图片的链接设置进去。

qq_44113347的博客 1159

星宸科技SSD20x/SSD21X应用层DEMO实战指南:从入门到深度定制

本文详细介绍了星宸科技SSD20x/SSD21X系列芯片的应用层DEMO开发实战,从基础环境搭建到深度定制开发。内容涵盖DEMO资源获取、核心功能实现、第三方库集成以及性能优化技巧,帮助开发者快速掌握智能显示和多媒体处理应用的开发方法。特别适合嵌入式开发者在智能家居、工业控制等场景中应用。

weixin_42524226的博客 270

Nginx:防盗链原理和配置

防盗链简单来说就是存在我们服务中的一些资源,只有我们规定的合法的一类人才能去访问,其他人就不能去访问的资源(如css,js,img等资源)。具体点就是用户发送请求给nginx服务器,nginx服务器根据请求去寻找资源,请求的比如说是有个index.html文件,这个文件中会包含很多js,css,img等资源,这些文件在这个骨架中会被二次请求,在第二次请求时,会在请求头部上加上有个referer,这个referer只会在第二次请求时才会被加上。(referer表示第二次资源的来源地址).........

qq_57377057的博客 7275

别再只盯着CXL协议了,聊聊CXL.mem里那个能动态调优内存性能的‘QoS遥测’到底怎么用

本文深入解析CXL.mem协议中的QoS遥测功能,探讨如何通过DevLoad指标动态调优内存性能。文章详细介绍了QoS遥测的核心机制、多QoS类别设备的实战配置,以及AI训练、金融交易和视频处理场景中的优化案例,帮助数据中心实现高效内存资源管理。

weixin_33725722的博客 437

YOLOv11改进 | Conv改进篇 | 含2种改进,引入DynamicConv替换普通Conv卷积下采样和C3k2_DynamicConv替换C3k2(来自CVPR2024)

本文提出了一种基于DynamicConv动态卷积优化的YOLOv11轻量化模型改进方案。通过引入多专家机制的动态卷积模块,在增加模型参数量的同时保持较低的计算复杂度(FLOPs),有效解决了低FLOPs模型在大规模预训练中的性能瓶颈问题。文章详细介绍了动态卷积的工作原理、核心代码实现,并提供了在YOLOv11中集成DynamicConv和C3k2_GhostModule_DynamicConv模块的完整教程,包括模块添加、配置文件修改和模型训练验证过程。实验结果表明,该方案在保持高效推理速度的同时显著提升了

Ai缝合怪、助力小伙伴高效发论文 538

硬核!Github 星标 79.4K 的阿里强推 Java 面试参考指南到底有多强?

【这里想说,因为自己也走了很多弯路过来的,所以才下定决心整理,收集过程虽不易,但想到能帮助到一部分自学java想提升Java架构师技术的,P5-P6-P7-P8 的人,心里也是甜的!有需要的伙伴请点㊦方】↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓。

m0_60721514的博客 578

实例详解C++程序的五大内存分区

本文详细讲述C++程序在运行时的5大内存分区。 下面使用日常开发中的编程实例,详细介绍一下这5个分区,以便大家能更深刻的理解这5大内存分区。 1、栈内存区 栈内存区是我们用的最多的分区,只要有函数的地方都会使用到这个分区。栈分区是用来存放函数参数及函数局部变量值的内存区,是由编译器在编译时自动分配和释放的。 函数中的参数与函数中的局部变量占用的内存是代码执行到函数(进入函数)是分配的,在............

dvlinker的技术专栏 1万+

java防盗链

一.防盗链的概念 内容不在自己的服务器上,通过技术手段将其他网站的内容(比如一些音乐、图片、软件的下载地址)放置在自己的网站中,通过这种方法盗取其他网站的空间和流量。 二.防盗链的产生 一般情况下,http请求时,一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的

开心的专栏 2927

华为OD机试 - 最快到达医院的方法(Python/JS/C/C++ 2024 E卷 100分)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2172

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

其实,图片防盗链的实现如此简单

其实,图片防盗链的实现如此简单

admin_2022的博客 1138

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java 盗链_javaWeb防止恶意登陆或防盗链的使用

使用场景:明明引用了一个正确的图片地址,但显示出来的却是一个红叉或写有“此图片仅限于***网站用户交流沟通使用”之类的“假图片”。用嗅探软件找到了多媒体资源的真实地址用下载软件仍然不能下载。下载一些资源时总是出错,如果确认地址没错的话,大多数情况都是遇上防盗链系统了。常见的防盗链系统,一般使用在图片、音视频、软件等相关的资源上。实现原理:把当前请求的主机与服务器的主机进行比对,如果不一样则就是恶意...

weixin_33892912的博客 550

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

实战-Nginx实现图片防盗链-2023.12.15(测试成功)(超详细)

什么是图片盗链首先我们聊聊什么是图片盗链?盗链指的是其他网站不经过你的许可直接通过链接使用你网站上的资源,从而消耗你的带宽和资源,这不仅会影响你网站的性能,还有可能会导致资源被滥用。简单来说,直接从你的网站上右键复制链接,粘贴到他自己的网站使用,实际请求的是你的服务器。今天我们就来说说nginx如何实现配置静态资源服务器及防盗链实现。一般常用的方法是在server或者location段中加入!详见下面的例子。

weixin_39246554的博客 3260

java#解决采集文章防盗链图片不显示问题

在互联网上采集数据做应用时,我们经常会遇到目标完整图片有防盗链,导致采集文章中的图片在应用中无法显示

myshare2022的专栏 743

防盗链的基本原理与实现

我的实现防盗链的做法,也是参考该位前辈的文章。基本原理就是就是一句话:通过判断request请求头的refer是否来源于本站。(当然请求头是来自于客户端的,是可伪造的,暂不在本文讨论范围内)。 首先我们去了解下什么是HTTP Referer。简言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务

稻草人技术博客 1万+

前端面试汇总

协议 子域名 主域名 端口号 资源同源策略是浏览器的核心,如果没有这个策略就会遭受网络攻击主要指的就是协议+域名+端口号三者一致,若其中一个不一样则不是同源,会产生跨域三个允许跨域加载资源的标签:img link script跨域是可以发送请求,后端也会正常返回结果,只不过这个结果被浏览器拦截了!JSONPCORSwebsocket反向代理。

CheriePan的博客 1316

Java破解图片防盗链-图片文件转发

springboot 破解图片防盗链

Mr丶GUO 914

绕过防盗链的几种方式

盗链是指在网站上显示其他网站上的图片、视频或其他媒体内容,而不经过原网站所有者的授权或许可。盗链会消耗原网站的带宽和资源,同时也会侵犯原网站所有者的版权和使用权利。 盗链行为通常被视为不道德和违法的,因为它侵犯了原网站所有者的权利,同时也给原网站带来不必要的成本和资源消耗。为了防止盗链,许多网站会设置防盗链功能,当检测到盗链时,会拒绝显示内容或者显示特定的替代内容。 因此,作为网络使用者,我们应该尊重其他网站所有者的权利,遵守网络使用规则,不进行盗链行为。如果我们需要在自己的网站上使用其他网站的内容

qq_68163788的博客 5419

java 盗链_java 防盗链详解及解决办法

java 防盗链详解及解决办法一.防盗链的概念内容不在自己的服务器上,通过技术手段将其他网站的内容(比如一些音乐、图片、软件的下载地址)放置在自己的网站中,通过这种方法盗取其他网站的空间和流量。二.防盗链的产生一般情况下,http请求时,一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的...

weixin_32115669的博客 1354

【JavaWeb开发】Referer防盗链的详解

本文将由what、why、how来讲解Referer,并有具体实例,如有错误,欢迎指正

此成非彼诚博客 5452
上一篇: 弃用MinIO,拥抱全新一代分布式文件系统RustFS
下一篇: Apache Commons Math3 使用指南:强大的Java数学库
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值