12、Nginx高级之高级模块(secure_link/secure_link_md5)

news2024/11/27 18:43:24

一、功能

防盗链;
ngx_http_secure_link_module模块用于检查所请求链接的真实性,保护资源免受未经授权的访问,并限制链接寿命。
该模块提供两种可选的操作模式。
  1. 第一种模式由 secure_link_secret 指令启用,用于检查所请求链接的真实性以及保护资源免遭未经授权的访问。
  2. 第二种模式由  secure_link 和secure_link_md5指令启用,也用于限制链接的生命周期。
默认情况下不构建此模块,应使用--with-http_secure_link_module配置参数启用它

二、场景

用户在客户端点击下载按钮,服务器收到请求后生成一个下载地址返回给客户端。客户端在用这个生成的下载地址去请求资源,此时 nginx去做校验,校验链接地址真伪和链接地址是否过期。如果链接地址是真的并且链接地址没有过期,就给客户端返回下载资源。( nginx验证和服务器生成密钥规则要一致,否则不会通过的

三、配置语法

secure_link:
语法: secure_link expression;  或者 secure_link md5_hash[,expiration_time];
默认: none
配置段: http, server,location
variables: yes
功能:
定义一个带有变量的字符串,将从请求中提取链接的md5和生命周期。
从字符串中提取的md5值与secure_link_md5指令定义的表达式的 MD5 哈希值进行比较如果校验和不同,则$secure_link变量设置为空字符串。如果校验和相同,则检查链路生存期。如果链接的生命周期有限并且时间已过,则$secure_link变量设置为“0”。否则,它被设置为“1”。
请求中传递的 MD5 哈希值以base64url编码。过期时间为 unix 时间,如果不加过期时间,那么这个连接永远都不会过期。请求中传递的过期时间可通过 $secure_link_expires 变量在 secure_link_md5  指令中使用。
secure_link_md5:
语法: secure_link_md5 secret_token_concatenated_with_protected_uri
默认: none
配置段: http, server,location
variables: yes
功能:
定义一个表达式,将为其计算 MD5 哈希值并将其与请求中传递的值进行比较。使用上面提供的 uri、密钥、过期时间生成 md5 哈希值

四、示例

1、前提:安装 secure_link 模块

nginx -V   # 输出nginx所有已安装模块,检查是否有ngx_http_secure_link_module
root@node1:~# nginx -V
nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
默认情况下 nginx 不会安装 secure_link 模块,需要手动指定添加( 别忘了现有的模块),步骤如下:
1、下载对应版本的nginx包:
​
$ wget http://nginx.org/download/nginx-1.14.0.tar.gz
$ tar -zxvf nginx-1.14.0.tar.gz
$ cd nginx-1.14.0
2、前往你的nginx安装目录,找到configure这个文件,添加--with-http_secure_link_module,执行命令    
$ ./configure --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-YlUNvj/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --with-http_secure_link_module  # --prefix指定安装目录  可能需要apt-get install -y libgd-dev libgeoip-dev
3、执行mak编译nginx:
$ make 
4、如果单纯添加模块,不需要install,而是执行以下操作,将打过补丁的nginx二进制文件--prefix=/usr/share/nginx)覆盖 /usr/sbin/目录(which nginx查看得到)中的文件即可
$ mv /usr/share/nginx/sbin/nginx /usr/sbin/
5、重启nginx:
$ nginx -s reload
6、查看模块

2、配置nginx 

server {
    listen       80;
    server_name  localhost;
    root         /usr/share/nginx/html/;

    location / {
        secure_link $arg_md5,$arg_expires;  # 客户端传递的md5和链接过期时间
        secure_link_md5 "$secure_link_expires$uri secret_key";  # secret_key为自定义的加密串;验证参数md5,expires是否和服务端生成验证的一致
       
        if ($secure_link = "") {
            return 403;       # 资源不存在或哈希比对失败
        }
        if ($secure_link = "0") {
            return 410;      # 时间戳过期
        }
       
        if ($request_filename ~* ^.*?\.(jpg)$){
            add_header Content-Disposition attachment;  # 不浏览,直接下载
        }
    }
}
准备带下载的文件test.jpg, 文件放在 / usr / share / nginx / html /目录下

3、使用shell脚本生成下载的链接

生产环境由开发在代码中实现

[root@img_server html]# cat md5url.sh
#!/bin/bash
servername="192.168.11.135"      # 服务器的IP或域名
download_file="/test.jpg"   # 测试下载文件的uri路径,该环境test.jpg放在/usr/share/nginx/html下面
time_num=$(date -d "+300 seconds" +%s)    # 定义过期时间为300秒
secret_num="secret_key"     # 自定义的加密串,和nginx的配置文件中加密串相同

res=$(echo -n "${time_num}${download_file} ${secret_num}"|openssl md5 -binary|openssl base64|tr +/ -_|tr -d =)  # 生成MD5值
echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}" # 打印下载链接
这个生成密钥的方式一般由后台生成,这里采用自己写的这个.sh文件来生成密钥, 命令: sh md5url.sh,
生成的密钥: http://192.168.11.135/test.jpg?md5=8l4smyfik0l7lsGWNDJY-g&expires=1686302780
4、使用生成的下载链接进行访问
过五分钟(即脚本中300秒)再次访问,返回410:
注意:
  • 密钥防止泄露、以及经常更新密钥
  • 下载服务器和链接生成的服务器上的时间不能相差太大,否则容易出现文件一直都是过期状态.

五、参考

(4条消息) nginx添加模块_青霄的博客-CSDN博客

Module ngx_http_secure_link_module  

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

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

相关文章

【Python爬虫开发基础⑤】HTML概述与基本标签详解

专栏:python网络爬虫从基础到实战 欢迎订阅!近期还会不断更新~ 往期推荐: 【Python爬虫开发基础①】Python基础(变量及其命名规范) 【Python爬虫开发基础②】Python基础(正则表达式) 【Python爬…

出境游复苏加速,距离“回到过去”还有多远?

6月14日一早,日本驻华大使馆一则“自6月19日起正式签发电子签证”的消息,引起了旅游圈的广泛关注。尽管其电子签方案因为流程繁琐甚至超过纸质签证,收获了一片吐槽之声,但游客对出境游的期待,却实打实地得到了展现。 …

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作,实际项目中我们还需要在客户端调用solr,就像调用数据库一样,我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库,主要用于与 Solr 服…

【Java学习记录-8】集合

集合 特点结构Collection概述创建方式常用方法遍历方式 List概述遍历方式特有方法 特点 提供一种存储空间可变的存储类型,存储的数据容量可以随时发生改变 结构 Collection 概述 是单列集合的顶层接口,它表示一组对象,这些对象也称为Coll…

好用的生产型企业ERP系统有哪些?

一、好用的生产型企业ERP系统有哪些? 目前而言,制造型想要部署一款好用的ERP系统,通常可以从2个方向来考虑: 第一方向:传统IT软硬件。比如:传统ERP厂商SAP; 第二方向:与新一代数字…

基于Java人才招聘网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

函数参数的拓展

函数参数的默认值 C 中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供默认参数的值,则使用默认值 参数的默认值必须在函数声明中指定 当函数声明时没有出现参数的默认值,而定义的时候出现参数的默认值,编译器会报错 当函数声…

软件测试面试题:如何测试App性能?

目录 为什么要做App性能测试? 怎么做App性能测试? 下面几款开源工具: APP性能测试关注哪些指标? 总结: 为什么要做App性能测试? 如果APP总是出现卡顿或网络延迟的情况,降低了用户的好感&am…

java面经 MySQL

存储引擎--MyISAM和InnoDB的区别 使用场景 对比 MySQL隔离级别--未提交读,提交读,可重复读,序列化 隔离级别含义 隔离级别 英文名称 含义 脏读 不可重复读 幻读 未提交读 READ UNCOMMITTED 可读取其它事务未提交的结果 √ √ √…

管理类联考——逻辑——真题篇——阅读新题型真题

阅读新题型真题 Part B-2010- Part B Directions: Read the following text and decide whether each of the statements is true or false. Choose T if the statement is true or F if the statement is not true. Mark your answers on ANSWER SHEET. (10 points) Copying…

Android——基本控件之下拉列表:Spinner(九)

1.知识点 &#xff08;1&#xff09;掌握下拉列表Spinner的使用&#xff1b; &#xff08;2&#xff09;可以通过程序配置Spinner显示内容&#xff1b; &#xff08;3&#xff09;可以通过配置文件配置Spinner显示内容。 2.具体内容 在html中&#xff0c;下拉列表使用<…

直击网络安全简史,现阶段提升免疫力是关键 | 产业安全观智库访谈

当下&#xff0c;AIGC、区块链、云计算等新兴技术发展如火如荼&#xff0c;网络安全的内涵与外延也随之出现许多变化&#xff0c;安全攻防也从早期的黑客炫技手段&#xff0c;演变为如今产业发展的底座。过去的20多年&#xff0c;网络安全行业出现了哪些新变化&#xff1f;安全…

springboot项目外卖管理 day06-用户端进行展示与下单操作

文章目录 一、用户地址簿1.1、需求分析1.2、功能展示 二、菜品展示2.1、需求分析 2.2、代码开发2.2.1、代码开发-梳理交互过程 2.3、功能测试 3、购物车功能3.1、需求分析3.2、数据模型3.3、代码开发3.3.1、代码开发-梳理交互过程3.3.2、代码开发-准备工作 4、下单4.1、需求分析…

C++算法:加权连通图的最小生成树(Kruskal)

文章目录 前言一、什么是最小生成树二、代码实现1、构建图2、生成树 总结原创文章&#xff0c;未经许可&#xff0c;严禁转载 前言 最小生成树算法就是在众多可行的方案中选择代价最小的方法。生活中我们经常会遇到类似可以抽象成最小生成树的例子&#xff1a;比如你要给家中布…

MYSQL数据库管理1

目录 数据库的基本概念 数据&#xff08;Data&#xff09; 表 数据库 数据库管理系统&#xff08;DBMS&#xff09; 数据库系统 数据库系统发展史 第一代数据库 第二代数据库 第三代数据库 当今主流数据库介绍 SQL Server&#xff08;微软公司产品&#xff09; Or…

3年经验来面试20K的测试岗,连基本功都不会,还不如去招应届生

这段时间公司项目急缺人手&#xff0c;面了不少人&#xff0c;竟然没有一个满意的。一开始瞄准的就是中高级的水准&#xff0c;也没指望来技术大牛&#xff0c;提供的薪资在15-25K&#xff0c;面试的人很多&#xff0c;但结果让人失望。 从简历上来说都是3-4年工作经验&#x…

python---列表和元组(2)

切片操作的基本使用 使用切片的时候省略边界 切片操作是一个比较高校的操作,进行切片的时候,只是取出了原有列表的一个部分,并不涉及到数据的拷贝,假设有一个很大的列表,进行切片,切片的范围也很大,即使如此,切片操作仍然非常高校. 切片操作还可以指定"步长",类比…

Leangoo领歌敏捷项目管理场景示例

Leangoo领歌​​​​​​​是一款专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速…

通过零代码ETLCloud实现金蝶云星空数据自动化同步

金蝶云星空系统介绍 金蝶云星空是一款基于云计算架构打造的全面财务管理软件&#xff0c;旨在为企业提供全方位、一站式的财务解决方案。其功能包括财务核算、现金管理、应付应收管理、成本核算、固定资产管理、税务管理等&#xff0c;覆盖了财务管理的各个方面&#xff0c;可…

【黄啊码】批量获取邮箱软件的下载和使用(外贸人必用的工具箱)

大家好&#xff0c;我是黄啊码&#xff0c;前两天有个朋友想通过邮箱实现获取邮箱地址&#xff0c;问我有没有类似的软件和教程&#xff0c;今天&#xff0c;他来了。。 该外贸软件可以按关键字收集电子邮件 使用内置的网站爬虫从网站中提取电子邮件和电话 与许多基于网络的工…