Module ngx_http_secure_link_module

指令
     secure_link
     secure_link_md5
     secure_link_secret
嵌入式变量

ngx_http_secure_link_module 模块 (0.7.18) 用于检查请求链接的真实性、保护资源免受未经授权的访问,并限制链接的有效期。

请求链接的真实性通过将请求中传递的校验和值与为该请求计算出的值进行比较来验证。如果链接具有有限的有效期且时间已过期,则该链接被视为已过期。这些检查的状态可在 $secure_link 变量中获取。

该模块提供了两种备选的操作模式。第一种模式由 secure_link_secret 指令启用,用于检查请求链接的真实性并保护资源免受未经授权的访问。第二种模式 (0.8.50) 由 secure_linksecure_link_md5 指令启用,也用于限制链接的有效期。

该模块默认不构建,必须使用 --with-http_secure_link_module 配置参数启用。

指令

语法 secure_link expression;
默认值
作用域 http, server, location

定义一个包含变量的字符串,从中提取链接的校验和值和有效期。

expression 中使用的变量通常与请求相关联;请参阅下面的 示例

从字符串中提取的校验和值将与由 secure_link_md5 指令定义的表达式的 MD5 哈希值进行比较。如果校验和不同,$secure_link 变量将被设为空字符串。如果校验和相同,则会检查链接的有效期。如果链接有有效期限制且时间已过期,则 $secure_link 变量被设为 “0”。否则,它被设为 “1”。请求中传递的 MD5 哈希值采用 base64url 编码。

如果链接具有有限的有效期,则过期时间以秒为单位(自 Epoch 时间即 1970 年 1 月 1 日 00:00:00 GMT 起计算)。该值在 MD5 哈希之后的表达式中指定,并用逗号分隔。请求中传递的过期时间可通过 $secure_link_expires 变量获取,以用于 secure_link_md5 指令。如果未指定过期时间,则链接具有无限有效期。

语法 secure_link_md5 expression;
默认值
作用域 http, server, location

定义一个表达式,计算其 MD5 哈希值并与请求中传递的值进行比较。

表达式应包含链接的安全部分(资源)和一个密钥(secret ingredient)。如果链接具有有限的有效期,表达式还应包含 $secure_link_expires

为了防止未经授权的访问,表达式可以包含一些关于客户端的信息,例如其 IP 地址和浏览器版本。

示例

location /s/ {
    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;
    }

    ...
}

链接 “/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647” 限制了 IP 地址为 127.0.0.1 的客户端对 “/s/link” 的访问。该链接还具有直到 2038 年 1 月 19 日(GMT)的有限有效期。

在 UNIX 系统上,md5 请求参数值可以通过以下方式获取:

echo -n '2147483647/s/link127.0.0.1 secret' | \
    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

语法 secure_link_secret word;
默认值
作用域 location

定义一个用于检查请求链接真实性的密钥 word

请求链接的完整 URI 如下所示:

/prefix/hash/link

其中 hash 是为链接和密钥的连接计算出的 MD5 哈希的十六进制表示,prefix 是不含斜杠的任意字符串。

如果请求的链接通过了真实性检查,$secure_link 变量将被设置为从请求 URI 中提取的链接。否则,$secure_link 变量将被设为空字符串。

示例

location /p/ {
    secure_link_secret secret;

    if ($secure_link = "") {
        return 403;
    }

    rewrite ^ /secure/$secure_link;
}

location /secure/ {
    internal;
}

对 “/p/5e814704a28d9bc1914ff19fa0c4a00a/link” 的请求将在内部重定向到 “/secure/link”。

在 UNIX 系统上,此示例的哈希值可以通过以下方式获取:

echo -n 'linksecret' | openssl md5 -hex

嵌入式变量

链接检查的状态。具体值取决于所选的操作模式。
请求中传递的链接有效期;仅旨在用于 secure_link_md5 指令中。