您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

如何用Nginx为自己的网站资源加上防盗链保护?

时间:2023-05-18 14:15:12  来源:今日头条  作者:Java狂人

1.前言

在这个流量为王的时代,掌握了流量密码,就相当于掌握了一切皆有可能的机遇,但是,越是流量为王,越该保持敬畏之心。

资源在获得流量的过程中扮演着极其重要的角色,如果我们的资源没有适当的保护机制,就会造成很大的损失。为了保护资源,我们可以添加防盗链机制。

Nginx对实现静态资源防盗链机制提供了很好的支持,接下来我们进入实战阶段。主要分为以下两种方式:

  • Referer信息校验
  • secure_link资源保护

2.Referer信息校验

Nginx静态资源防盗链一文中,已经详细介绍过实现方法,我们这里简单回顾一下。

2.1 实现原理

当浏览器向web服务器发起资源请求时,会在请求头中带上Referer字段,告诉服务器请求是从哪个页面过来的,服务器根据该信息进行校验并响应。

Nginx为我们提供了ngx_http_referer_module模块,可以获取请求头中Referer字段,根据字段值返回不同的响应,就可以达到如果不是从我们自己网站发起的请求,就直接返回403禁止访问。

2.2 配置指令

作用域:server, location

语法:valid_referers none | blocked | server_names | string ...;

1)valid_referers none;

表示请求头中不存在Referer字段。

2)valid_referers blocked;

表示请求头中存在Referer字段,且其值不以http://或https://开头。

3)valid_referers server_names;

表示请求头中存在Referer字段,且其值包含nginx配置文件中server_name的其中一个。

4)任意字符串

表示请求头中存在Referer字段,且定义了服务器名称和可选的URI前缀。服务器名称的开头或结尾可以有一个“*”。在检查过程中,“Referer”字段中的服务器端口被忽略。例如*.example.com example.*
www.example.org/galleries/

5)正则表达式

表示请求头中存在Referer字段,且第一个符号应该是“~”(Nginx解析正则表达式规范)。需要注意的是,表达式将从http://或https://之后开始的文本相匹配。

6)配置示例

 valid_referers none blocked server_names *.example.com test.example.* ~.example.com

2.3 实战

除了使用valid_referers指令外,我们还需要用到一个内置变量$invalid_referer,如果Referer请求标头字段值被认为有效,则$invalid_referer的值为空字符串,否则为“1”。

 # 如果获取图片时,不是从www.example.com页面发起的请求,则禁止访问。
 location ~^/.*.(png|jpg|gif|jfif) {
     valid_referers www.example.com;
     if ($invalid_referer){
         return 403;
     }
     root   html;
 }

Tips:请求头的Referer字段信息是可以通过程序伪装生成的,因此根据Referer信息来实现防盗链并非100%可靠,但是,它能够限制大部分的盗链。

3.secure_link资源保护

前面我们提到,在使用Referer信息进行校验的时候,该字段信息可以通过程序伪装生成,并非100%可靠。

Nginx提供了
ngx_http_secure_link_module模块,可以对请求的链接进行真伪校验,并限制链接的有效时间。

官方文档:
https://nginx.org/en/docs/http/ngx_http_secure_link_module.html

话不多少,开整。

Tips:该模块默认不构建,构建时需要自行添加configure参数
--with-http_secure_link_module。

构建过程,可参照Nginx基本命令&不停机版本升级一文进行模块添加。

2.1 实现原理

资源链接按照约定的规则生成,Nginx服务器对链接进行真伪以及过期时间校验。

2.2 配置指令


ngx_http_secure_link_module模块为我们提供了两种校验模式:

  • 通过secure_link_secret指令,检查链接的真实性。
  • 通过secure_link与secure_link_md5指令,检查链接的真实性,并限制链接的有效时间。

接下来看看具体配置语法吧。

2.2.1 secure_link_secret

secure_link_secret指令用于指定需要通过MD5算法加密的字符串,同时需要配合$secure_link内置变量来对链接进行校验。

作用域:location

语法:secure_link_secret word;

word:需要进行MD5加密的字符串,例如your_secure_word。

URI格式:/prefix/hash/link,例如
/img/6b105c468b2a59681b799a7f532505e3/aa.jpg。

  • prefix:为不包含/的任意字符串,这里为img。
  • link:这里为aa.jpg。
  • hash:这里为link与word拼接之后的值(aa.jpgyour_secure_word)进行MD5加密后的结果。

$secure_link:内置变量,如果链接通过了真实性检查,则其值设置为从/prefix/hash/link中提取link的值(包含前面的/),否则将其设置为空字符串。

2.2.2 secure_link

secure_link指令定义需要从URI中取出的参数,包含MD5值和链接的有效时间。需要与secure_link_md 指令配合使用。

作用域:http, server, location

语法:secure_link expression;

配置示例:

http://192.168.110.101/img2/test.jfif?signature=vQ5_wrXQ_oxh5c3L9bbf8g&expires=1685003128

 # $arg_signature,$arg_expires意味着从URI中取出参数名为signature和expires的值
 secure_link $arg_signature,$arg_expires;

2.2.3 secure_link_md5

secure_link_md5指令定义一个表达式,计算表达式的MD5值,与URI传递的MD5值进行比较。需要配合secure_link指令和$secure_link_expires内置变量一起使用。

Tips:URI中MD5值以base64编码的形式传递。

作用域:http, server, location

语法:secure_link_md5 expression;

配置示例:

 secure_link $arg_signature,$arg_expires;
 secure_link_md5 "$secure_link_expires$uri secret";

$secure_link_expires用于获取secure_link中传递的expires的值。

secure_link与secure_link_md5指令的校验步骤如下:

  • 如果secure_link指令从URI参数中提取的signature值与secure_link_md5指令计算出的MD5值不匹配,则将$secure_link设置为空字符串;
  • 如果匹配,就校验链接的有效期,如果已过期则将$secure_link设置为"0",否则设置为"1"。

URI中的signature值可以通过以下方式获取:

1)Ubuntu命令行执行

 echo -n '1685003128/img2/test.jfif secret' | 
     openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

2)JAVA代码

引入Apache的commons-codec包

 <dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
 </dependency>
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.digest.DigestUtils;
 
 public class MD5 {
     public static void mAIn(String[] args) {
         Base64.encodeBase64URLSafeString(DigestUtils.md5("1685003128/img2/test.jfif secret"));
     }
 }

2.3 实战

2.3.1 secure_link_secret校验模式

配置示例:

Nginx代理服务器:192.168.110.101

 server {
         listen       80;
         server_name  localhost;
 
         location /img {
             default_type text/html;
             secure_link_secret test;
             if ($secure_link = ""){
                 return 403 "<p>You don't have permission to access the URL on this server.</p>";
             }
             rewrite ^ /secure$secure_link;
         }
 
         location /secure {
             proxy_pass http://192.168.110.100/img/;
         }
 }

服务端:192.168.110.100

location /img {
	default_type image/jpeg;
	root   /home/stone;
}

1)访问
http://192.168.110.101/img/test.jfif,不满足链接规则,403禁止访问。

 

2)访问
http://192.168.110.101/img/f5b20551b8d06384734de574dd7930ce/test.jfif,满足链接规则。

 

2.3.2 secure_link+secure_link_md5

配置示例:

Nginx代理服务器:192.168.110.101

location /img2 {
	default_type text/html;
	secure_link $arg_signature,$arg_expires;
	secure_link_md5 "$secure_link_expires$uri secret";

	if ($secure_link = ""){
		return 403 "<h1>Forbidden</h1><p>You don't have permission to access the URL on this server.</p>";
	}

	if ($secure_link = "0"){
		return 403 "<h1>Expired</h1><p>You don't have permission to access the URL on this server.</p>";
	}

	proxy_pass http://192.168.110.100/img/;
}

服务端:192.168.110.100

location /img {
	default_type image/jpeg;
	root   /home/stone;
}

1)访问
http://192.168.110.101/img/test.jfif,不满足链接规则,403禁止访问。

 

2)访问
http://192.168.110.101/img2/test.jfif?signature=vQ5_wrXQ_oxh5c3L9bbf8g&expires=1685003128,满足链接规则,且链接未过期。

3)访问
http://192.168.110.101/img2/test.jfif?signature=JY7G1brnFeEWcNShV74eNA&expires=1684398328,满足链接规则,但链接已过期。

 

以上就是Nginx实现静态资源防盗链机制的全部内容,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。



Tags:Nginx   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
为什么Nginx被称为“反向”代理呢?
Nginx(发音为"engine-x")是一款高性能、轻量级的开源Web服务器软件,也可用作反向代理服务器、负载均衡器和HTTP缓存。Nginx之所以有被称为“反向”代理,是因为它充当客户端设备...【详细内容】
2024-02-01  Search: Nginx  点击:(60)  评论:(0)  加入收藏
如何在Java环境中安装Nginx?
1. 下载Nginx:首先,前往Nginx官方网站(https://nginx.org/en/download.html)下载新版本的Nginx。选择适合您操作系统的版本,通常有Windows、Linux和Mac等不同操作系统的版本可供...【详细内容】
2024-01-22  Search: Nginx  点击:(61)  评论:(0)  加入收藏
一文教你学会使用Nginx
前段时间,了不起给大家说过如果使用 Docker 发布自己的后端项目,也就不再使用 Jar 包进行项目的发版操作,但是这其中就又涉及到了前端如何发版,为什么这么说,因为资深前端开发,可...【详细内容】
2023-12-27  Search: Nginx  点击:(88)  评论:(0)  加入收藏
Nginx 反向代理为什么叫做“反向”?
今天我们来聊聊正向代理和反向代理。01 正向代理(Forward Proxy)正向代理是位于用户设备和互联网之间的服务器。它代理的是客户端,是站在用户一方的。其真实客户端对于服务器不...【详细内容】
2023-12-06  Search: Nginx  点击:(90)  评论:(0)  加入收藏
Nginx的负载均衡实现,你学会了吗?
环境 主机 ip 用途 软件 web1 192.168.50.60 nginx-1 httpd web2 192.168.50.61 nginx-2 httpd proxy 192.168.50.62 负载...【详细内容】
2023-12-06  Search: Nginx  点击:(145)  评论:(0)  加入收藏
Nginx如何开启GZIP文件压缩,你学会了吗?
简介GZip 是一种改进web应用程序性能的技术,文件压缩后再传输可以减少传输数据,提升传输速度。在Nginx服务器上开启Gzip压缩可以有效减少网络传输流量,提升网站的访问速度和性...【详细内容】
2023-11-30  Search: Nginx  点击:(122)  评论:(0)  加入收藏
Nginx配置文件中的关键字是什么?
Nginx 是一款高性能的 Web 服务器软件,同时也是一款反向代理服务器软件。Nginx 的配置文件通常是 /etc/nginx/nginx.conf,以下是一个典型的配置文件,并对其中的关键字进行详细...【详细内容】
2023-11-22  Search: Nginx  点击:(148)  评论:(0)  加入收藏
Nginx 大揭秘:读写分离助力您轻松征服高并发
引言在构建高性能、高可用的 Web 应用时,如何有效地处理数据库的读写负担已成为一个十分重要的考虑因素。Nginx 作为一款强大的反向代理服务器,提供了简单而灵活的负载均衡配...【详细内容】
2023-11-14  Search: Nginx  点击:(53)  评论:(0)  加入收藏
Kubernetes 部署应用(Nginx)的两种方式,你更喜欢哪一种?
k8s发布应用的两种方式: kubernetes-dashboard kubectl命令行一、Dashboard方式配置部署:包含应用名称、容器镒、pod数量、Service非常的方便,不想设置配置yaml的可以很方便的...【详细内容】
2023-11-06  Search: Nginx  点击:(369)  评论:(0)  加入收藏
掌握Nginx的高级用法,构建高性能Web应用
Nginx是一款高性能的Web服务器和反向代理服务器,它广泛用于构建高性能、可靠和安全的Web应用程序。除了基本的用法外,Nginx还提供了一些高级功能和配置选项,可以进一步优化性能...【详细内容】
2023-10-26  Search: Nginx  点击:(220)  评论:(0)  加入收藏
▌简易百科推荐
为什么Nginx被称为“反向”代理呢?
Nginx(发音为"engine-x")是一款高性能、轻量级的开源Web服务器软件,也可用作反向代理服务器、负载均衡器和HTTP缓存。Nginx之所以有被称为“反向”代理,是因为它充当客户端设备...【详细内容】
2024-02-01  coderidea  微信公众号  Tags:Nginx   点击:(60)  评论:(0)  加入收藏
哪种服务器操作系统更好呢?
在当今的IT世界中,服务器操作系统扮演着至关重要的角色。它们是确保服务器能够高效、安全地运行的关键因素。然而,对于许多人来说,服务器操作系统的种类和特点可能是一个复杂的...【详细内容】
2024-01-30    简易百科  Tags:操作系统   点击:(76)  评论:(0)  加入收藏
什么是VPS服务器
VPS服务器是一种虚拟化技术,它将一台物理服务器划分为多个虚拟的独立服务器,每个虚拟服务器都可以拥有自己的操作系统、运行环境、应用程序等。这种技术使得每个虚拟服务器可...【详细内容】
2024-01-30    简易百科  Tags:VPS服务器   点击:(70)  评论:(0)  加入收藏
VPS服务器下载速度慢?这五招帮你提速
VPS服务器下载速度慢可能会让用户感到沮丧,尤其是对于需要大量下载和上传数据的用户。幸运的是,有一些方法可以帮助您提高VPS服务器的下载速度,使您的在线体验更加顺畅。在本文...【详细内容】
2024-01-30  IDC行业观察者    Tags:VPS服务器   点击:(57)  评论:(0)  加入收藏
美国VPS和英国VPS:地理位置对服务器性能的影响
在今天的数字时代,VPS已成为在线业务和网站托管的关键组成部分。然而,选择合适的VPS主机服务时,地理位置通常被忽视,尽管它对服务器性能有着重要的影响。本文将探讨美国VPS和英...【详细内容】
2024-01-26  IDC行业观察者    Tags:服务器   点击:(55)  评论:(0)  加入收藏
如何判断服务器所需带宽:基于业务需求和流量模式的关键考量
在选择服务器时,带宽是一个重要的考虑因素。带宽的大小直接影响到网站的加载速度和用户的访问体验。那么,如何判断服务器需要多大的带宽呢?本文将为你揭示这一关键问题的答案...【详细内容】
2024-01-26  源库科技    Tags:服务器   点击:(74)  评论:(0)  加入收藏
服务器内存空间及IO操作原理解析
服务器的内存空间分为内核空间和用户空间,而我们编写的程序通常在用户空间中运行。在进行读写操作时,我们直接操作的是用户缓冲区,而用户缓冲区的内容来自于内核缓冲区。这种内...【详细内容】
2024-01-23  王建立    Tags:服务器   点击:(44)  评论:(0)  加入收藏
如何在Java环境中安装Nginx?
1. 下载Nginx:首先,前往Nginx官方网站(https://nginx.org/en/download.html)下载新版本的Nginx。选择适合您操作系统的版本,通常有Windows、Linux和Mac等不同操作系统的版本可供...【详细内容】
2024-01-22  敲代码的小动    Tags:Nginx   点击:(61)  评论:(0)  加入收藏
服务器证书和SSL证书有啥区别?
在互联网经济时代,随着越来越多的信息以及合作都是从企业官网开始的,因此绝大多数企业都会为自己的网站配置SSL证书,以提高安全性。在接触SSL证书时,也有很多人称之为服务器证书...【详细内容】
2024-01-10  安信SSL证书    Tags:服务器证书   点击:(65)  评论:(0)  加入收藏
宝塔面板怎样部署java项目?
宝塔面板怎样部署java项目?在使用宝塔面板部署Java项目之前,需要确保已经安装了Java Development Kit (JDK)。接下来,将介绍如何使用宝塔面板来部署Java项目的步骤。步骤一:安装...【详细内容】
2024-01-09  西部数码    Tags:宝塔面板   点击:(112)  评论:(0)  加入收藏
站内最新
站内热门
站内头条