TrumanWong

Nginx连接校验模块

TrumanWong
6/25/2024

模块名称:ngx_http_secure_link_module

ngx_http_secure_link_module模块(Nginx 0.7.18开始)用于检查请求链接的真实性,保护资源免遭未经授权的访问,并限制链接寿命。常用于访问及文件下载的防盗链的实现。

该模块不是默认构建的,需要通过 --with-http_secure_link_module 配置参数来启用。

原理

该模块功能的实现原理如下:

  • HTTP应用程序计算出唯一的MD5字符串和过期时间。
  • HTTP应用程序把计算出的MD5字符串和过期时间以参数的形式与被限制的真实连接组成新的访问连接。
  • 用户单击有MD5字符串和过期时间参数的连接后,请求Nginx服务器。
  • Nginx通过secure_link指令获取用户访问连接中的MD5字符串和过期时间的值。
  • Nginx校验过期时间是否过期,当被判断为过期时,设置模块内置参数$secure_link的值为0。
  • NginxMD5字符串与secure_link_md5指令指定格式生成的MD5值进行比对,在过期时间内,当MD5被判断为一致时,设置模块内置参数$secure_link的值为1。
  • 模块内置参数$secure_link的值默认为空。

示例

Nginx配饰示例如下:

server {
    ...
    location /download { 
      secure_link $arg_secret_valid,$arg_secret_time;
      secure_link_md5 trumanwong$uri$arg_secret_time;
      if ($secure_link = "") {
        return 403;
      }
      if ($secure_link = "0") {
        return 405;
      }
      ...
    }
    ...
}

PHP配置示例如下:

<?php
// 密钥
$secret = 'trumanwong';
// 被保护的真实连接
$path = "/download/example.zip";
// 访问超时时间
$expire = time() + 10;
// 将访问密钥、访问路径、超时时间加密
$md5 = base64_encode(md5($secret . $path . $expire, true));
// 特殊字符“+”和“/”的处理
$md5 = strtr($md5, '+/', '-_');
// 特殊字符“=”的处理
$md5 = str_replace('=', '', $md5);
// 新的访问连接
$url = "https://trumanwl.com{$path}?secret_valid={$md5}&secret_time={$expire}";
echo '<a href="' . $url . '">example.zip</a>';
?>