一文搞定防盗链设计

大家好,我是蓝胖子,在涉及到图片或者视频链接时,通常都会提到防盗链,这一节我将会从防盗链的含义到落地,向大家展示如何设计资源的防盗链。

防盗链的含义与作用

防盗链,顾名思义,是为了防止资源被他人窃取而设计的。

通常我们将图片或视频链接存储到obs对象存储上,前端通过服务端返回的图片或视频链接访问obs上对应的资源,那如果这个链接被第三方网站获取到,便能在其网站上直接访问我们的视频或者图片资源。

防盗链的出现就是为了杜绝第三方网站能直接访问我们的视频或图片资源。让返回的资源链接只能被我们指定的网站进行访问

防盗链方案设计

接着,我以华为云的obs系统 为例, 讲几个关于防盗链的设计方案,供大家参考,

refer指定黑白名单

浏览器在加载静态资源时,会在请求头中加上Refer字段,其值为浏览器当前的网址,目的是为了告诉服务器,用户在访问资源之前的位置。

如果第三方网站获盗取到了我们的视频资源,那么在其访问时,Refer就是第三方网站的网址,我们可以在obs上配置reder黑白名单,指定资源让某些网站不允许访问或者对某些网站允许访问。

Pasted image 20240401163901.png

更加灵活的鉴权方式-远程鉴权

除此以外,还有种更加灵活的鉴权方式,通过自定义的代码来判断该访问链接是否允许被访问。在使用obs系统时,为了减少带宽成本,我们将会在obs前面,部署cdn节点,让用户访问的资源能够被缓存到离他比较近的cdn节点上。

通常cdn节点上可以配置对应的访问,例如华为云可以配置远程鉴权的地址,指向自己的服务器鉴权接口,在接口中定义对资源的访问权限,像cloudflare则是可以创建worker,在worker中定义链接的访问权限。

Pasted image 20240401164545.png

鉴权逻辑应该如何写,这里我提供一个比较通用的逻辑,给大家参考下。

在服务端返回给客户端资源在obs上的访问链接时,可以加上该链接的创建时间,在鉴权逻辑里申明一个链接的有效期,根据链接的产生时间和有效期 允许该链接在有效期内允许访问,比如返回给客户端的链接是

https://xxx?ctime=1711962048

ctime 则是链接的创建时间,但是仅仅这样是不够的,第三方网站可以获取到链接后修改ctime字段来修改链接的创建时间,所以我们还需要一个消息认证的机制,保证链接是服务器返回的且没有经过篡改,这里可以用消息认证算法实现。

拿消息认证算法hmac举例,服务器端定义一个只有自己知道的密钥,用该密钥对资源地址进行md5的摘要计算,如下是golang中的hamc的使用逻辑,

key := "hamcsecrete"
    data := "https://xxx?ctime=1711962048"
    hmac := hmac.New(md5.New, []byte(key))
    hmac.Write([]byte(data))
    fmt.Println(hex.EncodeToString(hmac.Sum([]byte(""))))

得到的消息认证码,加入到资源链接的参数中,如下,

https://xxx?ctime=1711962048&token=679f5d6f7d344dba1e33938ae1d41ab4

这样,鉴权服务器在得到资源链接时,就会将资源地址通过同样的消息认证算法和密钥计算token值,如果计算出的token值和资源链接中的token值一致,则继续查看链接是否在有效期范围内,在则允许访问,否则不允许访问。因为消息认证的密钥只有服务器知道,即使第三方网站获取到了链接,也无法得出正确的token值。

最后,在使用此逻辑的时候,要注意cdn服务器回源的条件,通常cdn是根据url路径查看是否需要回源,如果url地址不同,则会去访问源站服务器,我们当然不希望因为链接ctime的不同就再次去请求源站服务器,所以,在cdn节点处,需要配置,判断回源时需要忽略ctime和token的参数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

16_嵌入式文件系统选择

嵌入式文件系统选择 在进行嵌入式系统开发过程中,文件系统的选择和制作与硬件条件息息相关。根据硬件(Flash 或 RAM)的特性来指定相应的文件系统,能够充分利用硬件资源及提高系统效率。因为目前大部分的嵌入式文件系统都是建立在 …

【技巧】Leetcode 287. 寻找重复数【中等】

寻找重复数 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改 数组…

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现: 交通运输作为国民经济的载体,沟通生产和消费,在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系,生产水平越高…

中国90米分辨率可蚀性因子K数据

土壤可蚀性因子(K)数据,基于多种土壤属性数据计算,所用数据包括土壤黏粒含量(%)、粉粒含量(%)、砂粒含量(%)、土壤有机碳含量(g/kg)、…

计算机组成原理1:计算机系统概述

此系列介绍计算机的组成原理,参考书:《计算机组成原理考研复习指导》(王道论坛组编)。 1.计算机发展史 1.1 计算机发展 计算机变化 第一代计算机 ( 1946 − 1957 ) (1946-1957) (1946−1957):电子管时代。 逻辑元件采用电子管;使…

LVS、HAProxy

集群:将很多个机器组织到一起,作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类:负载均衡集群:Load Balance。高可用集群:High Available。高性能集群:High Performance Com…

酷开系统覆盖尽可能多的用户,助力酷开科技走在数字化营销前面

用户画像可看作企业应用大数据的根基,是定向广告投放与个性化推荐的前置条件,为数据驱动运营奠定了基础。酷开系统家庭激活终端超过6000万,针对全量用户进行分析,覆盖尽可能多的用户,为提升用户画像准确率提供了很好的…

GWO-CNN-BiLSTM多输入回归预测|灰狼群算法优化的卷积-双向长短期神经网络|Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&…

谷歌翻译示例

概述 项目需要,使用谷歌翻译,前提是得翻墙。 1、获取所有语言和其对应编码如下所示: {auto: 检测语言,sq: 阿尔巴尼亚语,ar: 阿拉伯语,am: 阿姆哈拉语,as: 阿萨姆语,az: 阿塞拜疆语,ee: 埃维语,ay: 艾马拉语,ga: 爱尔兰语,et: 爱沙尼亚语,or…

主站设备通过Modbus转Profinet网关与湿度传感器通讯配置

Modbus转Profinet网关(XD-MDPN100)可以实现不同协议设备通讯,有些现场需要实时监测环境参数,但大由于当时环境仪表设备不能达到直连效果,通过Modbus转Profinet网关,湿度传感器的数据可以被准确、可靠地传输…

三十个中文AI对话网站推荐

目录 写在前面 一、kimi 二、WeexAI 三、Cursor 四、智谱清言 五、讯飞星火 六、通义千问 七、文心一言 八、混元 九、豆包AI 十、其它 写在前面 总的来说,现在国内能用到的大模型类产品分国产和套壳两种。对于中文任务,这些大模型功能都大同…

文献学习-25-综合学习和适应性教学:用于病理性胶质瘤分级的多模态知识蒸馏

Comprehensive learning and adaptive teaching: Distilling multi-modal knowledge for pathological glioma grading Authors: Xiaohan Xing , Meilu Zhu , Zhen Chen , Yixuan Yuan Source: Medical Image Analysis 91 (2024) 102990 Key words: 知识蒸馏、模态缺失、胶质瘤…

C++ vector 动态 向量/数组

文章目录 【 1. vector 的声明与初始化 】1.1 vector 的声明1.2 vector 的初始化1.2.1 构造一个空的 vector1.2.2 指定数量初值的方式初始化 vector1.2.3 迭代器的方式初始化1.2.4 构造一个相同的 vector 【 2. vector 的相关操作 】2.1 插入元素2.1.1 在vector的末尾插入新元素…

ios 之 netty版本swiftNio(socket创建)

SwiftNio 简介 用于高性能协议服务器和客户端的事件驱动、无阻塞的网络应用程序框架。 SwiftNIO是一个跨平台异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 这就像Netty,但是为Swift写的。 Xcode引入swiftNio 在实…

【Linux】常见命令

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 常用命令 1. ls2. pwd3. cd4. touch5. cat6. mkdir7. rm8. cp9. mv10. tail11. vim12.…

idea使用docker将Java项目生成镜像并使用

1:开启docker 远程访问 使用 vim 编辑docker服务配置文件 vim /lib/systemd/system/docker.service [Service] Typenotify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not suppor…

2024-04-02 在使用QtRemoteObject 过程中遇到的问题记录

前言 QtRemoteObject 的使用分为静态和动态使用,静态使用需要定义rep文件,相当于通信协议,保证源端和节点端类型的统一。 这些可以参考这两文章: https://zhuanlan.zhihu.com/p/36501814 https://zhuanlan.zhihu.com/p/3710817…

校园圈子系统-论坛,跑腿,地图找伴,二手市场,语音交友,APP小程序H5三端源码交付,支持二开!

2024年最新版推荐一个论坛社区系统 /社区论坛小程序/商城论坛小程序/源码。 带热门,带算法推荐 ,低成本上线的,论坛社区小程序源码强大售后,持续更新 功能:小程序授权登陆,支持app双端,小程序,…

qt5-入门-自定义委托-简单例子

参考: Qt 自定义委托_w3cschool https://www.w3cschool.cn/learnroadqt/ov8h1j4z.html C GUI Programming with Qt 4, Second Edition 本地环境: win10专业版,64位,Qt 5.12 理论知识 Qt的model/view架构中,view只是…

FastAPI Web框架教程 第14章 部署

14-1 在Linux上安装Python 【环境】 腾讯云服务器 Centos 8 【安装方式】 源码编译安装 安装步骤: 第1步:更新yum源 cd /etc/yum.repos.d/ sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-* sed -i s|#baseurlhttp://mirror.centos.…