Nginx防盗链配置

1. 什么是盗链?

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

盗链在如今的互联网世界无处不在,盗图,盗视频、盗文章等等,都是通过获取正规网站的图片、视频、文章等的 url 地址,直接放到自己网站上使用而未经授权。 盗资源是黑产界以最小成本获取最高利益的一个常用手段。比如笔者最近考虑买房,在贝壳网上有房源的真是户型图以及VR。某些房产中介直接会盗用贝壳网上的真实户型图来骗取点击。因此,对于任何一个大型网站而言,做好防盗措施,避免自身利益受损是至关重要的。Nginx 在代理这类静态资源(图片、视频、文章等)时,可以通过配置实现防盗连的功能。

2. 如何防盗链?

盗链是直接使用正规网站保存图片、视频等的 URL 以获取相应的资源。最简单的防盗想法就是根据客户端请求资源时所携带的一些关键信息来验证请求的合法性,比如客户端 IP、请求 URL 中携带的 referer,如果不合法则直接拒绝请求。此外,由于这些基础信息都可以伪造,因此这样的基础手段也不一定安全。此外,还有登录认证、使用 cookie 等其他防盗连手段。另外,针对特定场景,比如流媒体直播中还有更为高级的防盗手段包括时间戳防盗链、swf 防盗链、回源鉴权防盗链等。

3. Nginx中防盗链配置

3.1 refer模块防盗

Nginx 用于实现防盗链功能的模块为 refer 模块,其依据的原理是: 如果网站盗用了你的图片,那么用户在点击或者查看这个盗链内容时,发送 http 请求的头部中的 referer 字段将为该盗版网站的 url。这样我们通过获取这个头部信息,知道 http 发起请求的页面,然后判断这个地址是否是我们的合法页面,不是则判断为盗链。Nginx 的 referer 模块中有3个指令,用法分别如下:

Syntax:	referer_hash_bucket_size size;
Default: referer_hash_bucket_size 64;
Context: server, locationSyntax:	referer_hash_max_size size;
Default: referer_hash_max_size 2048;
Context: server, locationSyntax:	valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location

最重要的是 valid_referers 指令,它后面可以带上多个参数,表示多个 referer 头都是有效的。它的参数形式有:

n

one: 允许缺失 referer 头部的请求访问
blocked: 有 referer 这个字段,但是其值被防火墙或者是代理给删除了
server_names: 若 referer 中的站点域名和 server_names 中的某个域名匹配,则允许访问
任意字符或者正则表达式

Nginx 会通过查看 referer 字段和 valid_referers 后面的 referer 列表进行匹配,如果匹配到了就将内置的变量$invalid_referer值设置为0,否则设置该值为1

Nginx 防盗链配置如下:

...location / {valid_referers none blocked *.domain.pub www.domain.com/nginx server_names ~\.baidu\.;if ($invalid_referer) {return 403;}return 200 "valid\n";}...

3.2 secure_link模块防盗

referer 头部值的防盗链方法过于脆弱,盗用者很容易通过伪造 referer 的值轻而易举跳过防盗措施。在 Nginx 中有一种更为高级的防盗方式,即基于 secure_link 模块,该模块能够检查请求链接的权限以及是否过期,多用于下载服务器防盗链。这个模块默认未编译进 Nginx,需要在源码编译时候使用 --with-secure_link_module 添加。

该模块的通过验证 URL 中的哈希值的方式防盗链。它的防盗过程如下:

由服务器或者 Nginx 生成安全的加密后的 URL, 返回给客户端;
客户端使用安全的 URL 访问 Nginx,获取图片等资源,由 Nginx 的 secure_link 变量判断是否验证通过;

secure_link 模块中总共有3个指令,其格式和说明分别如下:

Syntax:	secure_link expression;
Default: —
Context: http, server, locationSyntax:	secure_link_md5 expression;
Default: —
Context: http, server, locationSyntax:	secure_link_secret word;
Default: —
Context: location

通过配置 secure_link, secure_link_md5 指令,可实现对链接进行权限以及过期检查判断的功能。

和 referer 模块中的 $invalid_referer 变量一样,secure_link 模块也是通过内置变量 KaTeX parse error: Expected ‘EOF’, got ‘判’ at position 14: secure_link 判̲断验证是否通过。secure_link 的值有如下三种情况:

空字符串: 验证不通过
0: URL 过期
1: 验证通过

通常使用这个模块进行 URL 校验,我们需要考虑的是如何生成合法的 URL ?另外,需要在 Nginx 中做怎样的配置才可以校验这个 URL?

生成合法的 URL 和 指令 secure_link_md5 有关。例如:

secure_link_md5 "$secure_link_expires$uri$remote_addr secret";

如果 Nginx 中secure_link_md5 是上述配置,那么生成合法 url 的命令如下:

# 2020-02-05 21:00:00 转换成时间戳为1580907600
echo -n '1580907600/test.png127.0.0.1 secret' | \openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

通过上述命令,我们得到了一个 md5 值:cPnjBG9bAZvY_jbPOj13mA,这个非常重要。接下来,构造合的 URL 和指令 secure_link 相关。如果 secure_link 指令的配置如下:

secure_link $arg_md5,$arg_expires;

那么我们的请求的 url 中必须带上 md5 和 expires 参数,例如:

http://180.76.152.113:9008/test.png?md5=cPnjBG9bAZvY_jbPOj13mA&expires=1580907600

对于 Nginx 中的校验配置示例如下:

location ~* .(gif|jpg|png|swf|flv|mp4)$  {secure_link $arg_md5,$arg_expires;secure_link_md5 "$secure_link_expires$uri$remote_addr secret";# 空字符串,校验不通过if ($secure_link = "") {return 403;}# 时间过期if ($secure_link = "0") {return 410 "URL过期,请重新生成";}root /root/test;
}

在 Nginx 的配置中,除了前面提到的 secure_link 和 secure_link_md5 指令外,我们对通过校验和校验失败的情况进行了处理。接下来请看实验部分。

4. 案例实战

4.1 refer 模块防盗链测试

在 nginx.conf 中加入如下防盗配置:

...http {...server {listen 9008;location / {valid_referers none blocked *.domain.pub www.domain.com/nginx server_names ~\.baidu\.;if ($invalid_referer) {return 403;}return 200 "valid\n";}}...
}...

重新加载或者启动 Nginx 后,我们进行如下操作:

[shen@shen Desktop]$ curl -H 'referer: http://www.domain.com/test' http://180.76.152.113:9008 
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>
[shen@shen Desktop]$ curl -H 'referer: http://www.domain.com/nginx' http://180.76.152.113:9008 
valid
[shen@shen Desktop]$ curl -H 'referer: ' http://180.76.152.113:9008 
valid
[shen@shen Desktop]$ curl http://180.76.152.113:9008 
valid
[shen@shen Desktop]$ curl -H 'referer: http://www.domain.pub/test' http://180.76.152.113:9008 
valid

http 请求 referer 的值存在,但是没有匹配后面的域名,所以返回403。其余的请求中 referer 值要么不存在,要么没有这个头部,要么匹配了后面的域名正则表达,都通过了 referer 校验,所以都返回 “valid” 字符串。我们通过构造不同的 referer 头部字段成功的绕过了 Nginx 的referer 模块校验,也说明了这种防盗的方式极不靠谱。

4.2 secure_link 防盗链测试

准备一个静态图片, 名为 test.png,放到搭建了 Nginx 的服务器上,全路径为 /root/test/test.png。
准备 Nginx 配置如下:

...http {...server {listen  8000;location / {# return 200 "$remote_addr";root /root/test;}}server {listen 8001;location ~* .(jpg|png|flv|mp4)$  {secure_link $arg_md5,$arg_expires;secure_link_md5 "$secure_link_expires$uri$remote_addr secret";# 空字符串,校验不通过if ($secure_link = "") {return 403;}# 时间过期if ($secure_link = "0") {return 410;}# 校验通过,访问对的静态资源root /root/test;}}}...

首先,在浏览器上访问8000端口我们可以获取对应的 $remote_addr 变量值(打开 return 的注释配置),结果为103.46.244.69, 这是客户端请求时的对外 IP。访问浏览器上访问8000端口,URI=/test.png, 可以看到这个静态图片。
在这里插入图片描述

接下来,我们在访问8001端口,URI=/test.png时,可以发现返回403页面,说明安全模块生效。

在这里插入图片描述

当前时间为2020年02月05日晚上9点半,我们找一个过期时间晚上10点,得到相应的时间戳为1580911200。按照 secure_link_md5 指令格式,使用如下 shell 命令生成 md5 值:

[shen@shen Desktop]$ echo -n '1580911200/test.png103.46.244.69 secret' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
KnJx3J6fN_0Qc1W5TqEVXw

这样可以得到我们的安全访问 URL 为:

# 访问静态资源test.png的安全URL为:
http://180.76.152.113:8001/test.png?md5=KnJx3J6fN_0Qc1W5TqEVXw&expires=1580911200

再次到浏览器上访问时候,我就可以看到静态图片了。
在这里插入图片描述

测试过期后的结果。在过期之后再用这个 URL 访问时无法查看图片,而且返回的是 410 的状态码,这说明 Nginx 成功检测到这个密钥值已经过期。

5. 小结

防盗链的知识,然后开始介绍 Nginx 中的防盗链配置。一般的 Nginx 防盗链手段都是通过 referer 字段来判断请求的来源地,由此去判定请求是否合法。但是该字段容易伪造,所以很少用该方法实现防盗功能。而Nginx 的 secure_link 模块主要是使用 hash 算法加密方式,一般用于图片、视频下载,生成下载 URL,安全性高。此外,我们也可以使用一些第三方的模块增强 Nginx 的防盗链功能,比如常用的第三放模块ngx_http_accesskey_module 可用于实现文件下载的防盗功能。

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

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

相关文章

Oracle+11g+笔记(8)-备份与恢复机制

Oracle11g笔记(8)-备份与恢复机制 8、备份与恢复机制 8.1 备份与恢复的方法 数据库的备份是对数据库信息的一种操作系统备份。这些信息可能是数据库的物理结构文件&#xff0c;也可能是某一部分数 据。在数据库正常运行时&#xff0c;就应该考虑到数据库可能出现故障&#…

基于Multisim的篮球比赛电子记分牌设计与仿真

一、设计任务与要求 设计一个符合篮球比赛规则的记分系统。 &#xff08;1&#xff09;有得1分、2分和3分的情况&#xff0c;电路要具有加、减分及显示的功能。 &#xff08;2&#xff09;有倒计时时钟显示&#xff0c;在“暂停时间到”和“比赛时间到”时&#xff0c;发出声光…

CTF-PWN: 什么是_IO_FILE?

重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建&#xff1f; _IO_FILE 结构体的实例是在程序使用标准 I/O 函数&#xff08;如 fopen、fclose、fread、fwrite 等&#xff09;时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…

Apache paimon-CDC

CDC集成 paimon支持五种方式通过模式转化数据提取到paimon表中。添加的列会实时同步到Paimon表中 MySQL同步表:将MySQL中的一张或多张表同步到一张Paimon表中。MySQL同步数据库:将MySQL的整个数据库同步到一个Paimon数据库中。API同步表:将您的自定义DataStream输入同步到一…

电子信息-毕业设计选题推荐

人工智能与电子信息工程的融合 基于深度学习的电子信息系统故障诊断 人工智能算法在电子信息工程中的优化应用 电子信息工程中的智能图像识别技术 无线传感器网络 无线传感器网络在环境监测中的电子信息采集 多传感器融合的无线传感器网络应用 无线传感器网络中的数据压缩算法与…

linux 删除当前目录下修改时间超过1天的文件

在Linux中&#xff0c;你可以使用find命令结合-mtime选项来删除当前目录下修改时间超过1天的文件。以下是具体的命令示例&#xff1a; find . -type f -mtime 1 -delete解释一下上述命令&#xff1a; find&#xff1a;这是用于在文件系统中查找文件和目录的命令。.&#xff1…

【面试全纪实 | Linux 01】请回答,你真的了解Linux吗?

1. 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位 硬件。Linux继承了Unix以网络为核心的设计思想&#…

代码随想录训练营Day11 | 226.翻转二叉树 - 101. 对称二叉树 - 104.二叉树的最大深度 - 111.二叉树的最小深度

226.翻转二叉树 题目链接&#xff1a;226.翻转二叉树思路&#xff1a;遍历二叉树&#xff0c;遍历的时候交换左右节点即可代码&#xff1a; TreeNode* invertTree(TreeNode* root) {reverse(root);return root;}// 迭代法&#xff0c;层序遍历void f2(TreeNode* root) {queue…

易友BOM管理软件

易友BOM管理软件介绍 易友BOM管理软件是一款功能齐全、操作简便、安全可靠的BOM管理系统。它为企业提供了多方面的BOM管理解决方案&#xff0c;帮助企业提高生产效率、降低成本、增强灵活性并提升竞争力。制造企业&#xff0c;都可以通过易友BOM管理软件来实现BOM管理的优化和…

安全见闻-二进制与网络安全的关系

一、二进制的基本概念 二、二进制在网络安全中的重要性 三、二进制安全的概念与范畴 1. 二进制安全的定义 2. 范畴 四、二进制安全的渗透测试方法 1. 静态分析 2. 动态分析 3. 模糊测试 4. 漏洞利用 5. 代码审计 五、结论 学习视频泷羽sec&#xff1a;安全见闻&…

git 怎么保留某个文件夹忽略其下面的所有文件?

在 Git 中&#xff0c;如果你想要保留某个文件夹&#xff08;比如 folder/&#xff09;但忽略其下面的所有文件&#xff0c;可以使用 .gitignore 文件来实现。需要注意的是&#xff0c;Git 不会自动创建空目录。因此&#xff0c;为了让 Git 记录这个空目录&#xff0c;你需要在…

【模型学习之路】手写+分析bert

手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前&#xff0c;建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…

不用求人,4个方法快速恢复小米手机删除短信

手机短信作为我们日常办理事情的重要验收通道&#xff0c;往往承载着许多重要的信息。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了重要的短信。那么&#xff0c;小米手机用户如何恢复这些被删除的短信呢&#xff1f;接下来&#xff0c;我们将分点为您详细…

爆肝整理14天AI工具宝藏合集(三)

&#x1f6e0;️以下是我为大家整理的AI工具宝藏合集&#xff08;三&#xff09;&#xff1a; &#x1f4a1;AI搜索 1️⃣ 天工AI搜索 2️⃣ 秘塔AI搜索 3️⃣ 夸克AI搜索 4️⃣ 开搜AI搜索 &#x1f4a1; AI视频 1️⃣ 可灵AI 2️⃣ 即梦AI 3️⃣ Vidu 4️⃣ Stable Video …

vue版本太低无法执行vue ui命令

连接 ui和create目前都只支持3.0以后得版本才能使用 https://blog.csdn.net/m0_67318913/article/details/136775252?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-136775252-blog-121204604.235v43pc_blog_bottom_relevance…

ETL集成工具丨如何运用ETLCloud单步调试断点功能

在现代数据处理领域&#xff0c;ETLCloud 的单步调试断点功能正成为数据管理的重要工具。ETLCloud 是一个强大的云端数据处理平台&#xff0c;它提供了灵活的单步调试功能&#xff0c;使得用户能够逐步跟踪和分析数据处理流程。本文将探讨如何运用 ETLCloud 的单步调试断点功能…

python 模块和包、类和对象

模块 模块是包含 Python 代码的文件&#xff0c;通常用于组织相关的函数、类和其他语句。模块可以被导入并在其他 Python 文件中使用。 创建模块 假设你创建了一个名为 mymodule.py 的文件&#xff0c;内容如下&#xff1a; # mymodule.pydef greet(name): return f"…

通信原理概论复习笔记(2):模拟调制与数字调制

5 模拟调制系统 调制: 将消息信号搭载(边带)到载波参数上(调幅; 调频; 调相); 边带滤波器 h ( t ) ↔ H ( ω ) h(t)\leftrightarrow H(\omega) h(t)↔H(ω). 载波: 高频周期性震荡信号; c ( t ) A cos ⁡ ( ω c t φ ) c(t)A\cos(\omega_c t\varphi) c(t)Acos(ωc​tφ)…

Linux系统用户操作以及权限管理

用户账号 用户账号&#xff1a;linux系统当中用户的角色&#xff0c;以及用户所拥有的权限 超级管理员&#xff1a;root roottest1&#xff1a;~# 命令含义root表示当前的登录用户test1当前主机名~当前目录#表示当前用户时管理员$表示当前用户是普通用户 exit&#xff1a;…

全新更新!Fastreport.NET 2025.1版本发布,提升报告开发体验

在.NET 2025.1版本中&#xff0c;我们带来了巨大的期待功能&#xff0c;进一步简化了报告模板的开发过程。新功能包括通过添加链接报告页面、异步报告准备、HTML段落旋转、代码文本编辑器中的文本搜索、WebReport图像导出等&#xff0c;大幅提升用户体验。 FastReport .NET 是…