使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接

一、模块简介

  • 版本:自 NGINX 0.7.18 起引入

  • 功能

    1. 签名校验:对请求 URI 中的签名进行校验,保证链接未经篡改。
    2. 时效控制:根据请求中携带的过期时间,判断链接是否仍在有效期。
  • 启用方式:编译 NGINX 时加入 --with-http_secure_link_module 参数。

二、两种工作模式

1. 简单的“秘密词”模式

  • 指令secure_link_secret word;
  • 原理:在 URL 中以 /前缀/<md5_hex>/<真实路径> 形式传递签名,NGINX 对比签名是否匹配。
  • 优点:配置简单,无需传递过期参数;
  • 缺点:无法控制时效,仅做防篡改。
配置示例
server {listen 80;server_name example.com;# 开启“秘密词”模式,secret 为约定好的密钥location /p/ {secure_link_secret secret;# 签名校验失败返回 403if ($secure_link = "") {return 403;}# 内部重写到受保护的真实路径rewrite ^ /secure/$secure_link break;}# 真实资源目录,仅允许内部访问location /secure/ {internal;root /data/protected;}
}
  • 签名生成(Linux 下)

    # 真实资源为 /p/link,secret 为 secret
    echo -n 'linksecret' | openssl md5 -hex 
    # 输出:5e814704a28d9bc1914ff19fa0c4a00a
    # 最终访问:
    #   http://example.com/p/5e814704a28d9bc1914ff19fa0c4a00a/link
    

2. 带过期时间的“MD5+Expires”模式

  • 指令

    • secure_link $arg_md5,$arg_expires;
    • secure_link_md5 "<expr> secret";
  • 原理

    1. 从请求参数(如 ?md5=...&expires=...)中提取签名和过期时间;
    2. 使用指定表达式(通常包含 $secure_link_expires, $uri 和密钥)计算 MD5,并与请求中的签名比对;
    3. 如果签名匹配且当前时间 ≤ 过期时间,则 $secure_link=1,否则为 0 或空串;
  • 优点:既能防篡改,又可设置时效;

  • 缺点:需要在 URL 中额外传递 expires 参数,URL 更长一些。

配置示例
server {listen 80;server_name example.com;location /s/ {# 提取 md5 签名 和 expires 时间secure_link   $arg_md5,$arg_expires;# 用 expires + URI + 客户端 IP + secret 组合生成 md5secure_link_md5 "$secure_link_expires$uri$remote_addr secret";# 签名不匹配(变量为空)拒绝访问if ($secure_link = "") {return 403;}# 已过期(变量为“0”)返回 410 Goneif ($secure_link = "0") {return 410;}# 校验通过,正常转发或返回静态资源root /data/protected;}
}
  • 签名生成(Linux 下):

    # 假设当前时间戳为 2147483647,资源 URI 为 /s/link,客户端 IP 为 127.0.0.1,secret 为 secret
    data="2147483647/s/link127.0.0.1 secret"
    # 计算二进制 MD5 并做 base64url 编码:
    openssl md5 -binary <<<"$data" \| openssl base64 \| tr '+/' '-_' | tr -d '='
    # 例如得到 _e4Nc3iduzkWRm01TBBNYw
    # 最终访问链接:
    #   http://example.com/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647
    

三、常见注意事项

  1. 时间同步:确保 NGINX 服务器时间与客户端签名生成时的时间保持一致,可采用 NTP 校时。
  2. 密钥安全secret 或其他密钥不应硬编码在公网上,建议放在受限权限的配置文件中,并定期轮换。
  3. IP 限制:示例中加入了 $remote_addr,可绑定签名与客户端 IP,进一步提高安全性;
  4. 缓存:如果使用了缓存(如 proxy_cachefastcgi_cache),注意签名 URL 往往带不同参数,可能导致缓存失效;
  5. 加密算法:本模块只支持 MD5,若需更强安全可在外部使用更强算法生成签名,并在 NGINX 前端(如 Lua、JS)验证。

四、应用场景

  • 下载加速与防盗链:为用户生成带时效的临时下载链接,避免盗链和过期下载。
  • 视频点播:保护视频流地址,防止链接被无效抓取或分享。
  • 动态接口防滥用:对关键接口生成一次性或限时访问链接,防止机器刷接口。

五、总结

ngx_http_secure_link_module 模块为 NGINX 提供了简单高效的链接保护与时效控制能力。两种模式各有侧重:

  • secure_link_secret:轻量、防篡改
  • secure_link + secure_link_md5:防篡改 + 时效控制

您可以根据业务需求选择合适方案,并结合 IP、UA、Referer 等信息,进一步增强安全性。希望本文对您快速上手并应用该模块有所帮助!如果有任何问题或优化建议,欢迎在评论区讨论。

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

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

相关文章

前端三剑客之HTML

前端HTML 一、HTML简介 1.什么是html HTML的全称为超文本标记语言(HTML How To Make Love HyperText Markup Language )&#xff0c;是一种标记语言。它包括一系列标签&#xff0c;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整…

网络安全-等级保护(等保) 2-0 等级保护制度现行技术标准

################################################################################ 第二章&#xff1a;现行等保标准要求&#xff0c;通过表格方式详细拆分了等保的相关要求。 GB 17859-1999 计算机信息系统 安全保护等级划分准则【现行】 GB/T22240-2020 《信息安全技术 网…

目标检测 LW-DETR(2024)详细解读

文章目录 整体架构 LW-DETR全称Light-Weight DETR&#xff0c;是百度团队提出的第二代面向实时检测算法&#xff0c;比yolo v8的速度和精度更好 整体架构 LW-DETR 由一个ViT编码器&#xff08;Vision Transformer Encoder&#xff09;、一个投影器&#xff08;Projector&#…

DVWA-XSS

DOM low 这是一个下拉框的形式&#xff0c;但是如果我们不让他等于English呢&#xff0c;换成js代码呢&#xff1f; <script>alert(xss);</script> Medium <script> 标签&#xff0c;但仅使用简单的字符串匹配进行替换&#xff08;比如移除 "<scr…

想要建站但没有服务器?雨云RCA,免服务器即可搭建完整网站!!!

大家好&#xff01;时隔几个星期没有发文章了。 最近&#xff0c;雨云发布了一个新的项目——雨云云应用&#xff08;RCA&#xff0c;Rainyun Cloud Application&#xff09;&#xff0c;在没有服务器的情况下&#xff0c;可以小白部署一个完整的网站&#xff0c;免去了繁琐的…

智能事件分析边缘服务器:交通管理与安全监测的利器

在当今交通管理和安全监测的领域中&#xff0c;智能化、高效化的设备需求日益增长。智能事件分析边缘服务器凭借其卓越的性能和丰富的功能&#xff0c;成为了该领域的佼佼者。 一、产品概述 智能事件分析边缘服务器是一款采用嵌入式 Linux 操作系统的边缘事件分析终端。它具有…

2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通

前言 自安卓7.0高版本系统不在信任用户证书&#xff0c;https抓包方式市面查找方法太过复杂手机要root等&#xff0c;前置条件要求太高太复杂&#xff0c;看的头痛&#xff0c;今天一台电脑按步骤操作完即可抓包https,给大家搞定抓包https问题。支持直接编辑修改请求参…

Neon数据库:让Postgres更智能的选择!

Neon:革新的Serverless PostgreSQL解决方案 在当今快速发展的技术世界,数据库的效率和灵活性成为众多开发者关注的重中之重。Neon,以其独特的serverless架构,正引领着这一变革。本文将深入探讨Neon的独特构架、应用场景以及具体的使用方法,帮助您快速掌握这一开源项目的精…

从开发者角度看数据库架构进化史:JDBC - 中间件 - TiDB

作者&#xff1a; Lucien-卢西恩 原文来源&#xff1a; https://tidb.net/blog/e7034d1b Java 应用开发技术发展历程 在业务开发早期&#xff0c;用 Java 借助 JDBC 进行数据库操作&#xff0c;虽能实现基本交互&#xff0c;但需手动管理连接、编写大量 SQL 及处理结果集&a…

Vue 3.0 Transition 组件使用详解

Vue 3.0 的 Transition 组件提供了一种简单的方式来为元素或组件的进入/离开添加动画效果。下面是使用<script setup>语法糖的实现方式。 1. 基本用法 使用场景&#xff1a;当需要为元素的显示/隐藏添加简单的淡入淡出效果时&#xff0c;这是最基础的过渡实现方式。 &…

代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)

图论part03 孤岛的总面积 代码随想录链接 题目链接 视频讲解链接 思路&#xff1a;既然某个网格在边界上的岛屿不是孤岛&#xff0c;那么就把非 孤岛的所有岛屿变成海洋&#xff0c;最后再次统计还剩余的岛屿占据的网格总数即可。 dfs&#xff1a; import java.util.Scanner…

C#自定义扩展方法 及 EventHandler<TEventArgs> 委托

有自定义官方示例链接&#xff1a; 如何实现和调用自定义扩展方法 - C# | Microsoft Learn 1.静态类 2.静态方法 3.第一参数固定为this 要修改的类型,后面才是自定的参数 AI给出的一个示例&#xff1a;没有自定义参数 、有自定义参数的 using System; using System.Colle…

Zephyr OS 中的 FIFO 接口应用介绍

目录 概述 1 FIFO的接口函数 1.1 K_FIFO_DEFINE函数 1.2 k_fifo_init函数 1.3 k_fifo_put函数 1.4 k_fifo_get 函数 1.5 k_fifo_is_empty 函数 2 应用验证 2.1 UART中使用FIFO范例 2.2 生产-消费类型范例 3 注意事项 3.1 内存管理 3.2 线程安全边界 概述 Zephy…

Spring Boot 集成 Elasticsearch【实战】

前言&#xff1a; 上一篇我们简单分享了 Elasticsearch 的一些概念性的知识&#xff0c;本篇我们来分享 Elasticsearch 的实际运用&#xff0c;也就是在 Spring Booot 项目中使用 Elasticsearch。 Elasticsearch 系列文章传送门 Elasticsearch 基础篇【ES】 Elasticsearch …

Win11下轻松搭建wiki.js,Docker.desktop部署指南(mysql+elasticsearch+kibana+wiki.js)

Docker.desktop部署wiki.js指南 前言环境和要求介绍提前准备 1. elasticsearch1.1 部署容器1.2 参数说明1.3 验证容器是否部署成功 2. kibana2.1 部署容器2.2 验证是否部署成功2.3 安装IK分词器 3. MySql3.1 部署容器3.2 增加数据库和wiki.js所需要的账号 4. wiki.js4.1 部署容…

PCB设计教程【入门篇】——电路分析基础-元件数据手册

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、数据手册的重要…

【论文阅读 | AAAI 2025 | FD2-Net:用于红外 - 可见光目标检测的频率驱动特征分解网络】

论文阅读 | AAAI 2025 | FD2-Net&#xff1a;用于红外 - 可见光目标检测的频率驱动特征分解网络 1.摘要&&引言2. 方法2.1总体架构2.2特征分解编码器2.3多模态重建机制2.4训练损失 3.实验3.1实验设置3.2主要结果3.3消融研究 4.结论 题目&#xff1a;FD2-Net: Frequency-…

CAU人工智能class3 优化器

优化算法框架 优化思路 随机梯度下降 随机梯度下降到缺点&#xff1a; SGD 每一次迭代计算 mini-batch 的梯度&#xff0c;然后对参数进行更新&#xff0c;每次迭代更新使用的梯度都只与本次迭代的样本有关。 因为每个批次的数据含有抽样误差&#xff0c;每次更新可能并不会 …

webpack 学习

webpack打包流程及原理 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器&#xff08;module bundler&#xff09;。在 Web 开发中&#xff0c;它主要用于将各种资源&#xff08;如 JavaScript、CSS、图片等&#xff09;打包成浏览器可以直接运行的文件。Webpack 的核…

HTML5中的Microdata与历史记录管理详解

HTML5中的Microdata与历史记录管理解析 一、Microdata结构化数据 核心属性 itemscope 声明数据范围itemtype 指定数据词汇表&#xff08;如http://schema.org/Product&#xff09;itemprop 定义数据属性 <div itemscope itemtype"http://schema.org/Book">…