模块 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_link 和 secure_link_md5 指令启用,也用于限制链接的生命周期。
此模块默认不构建,应使用 --with-http_secure_link_module 配置参数启用它。
指令
| 语法 |
secure_link |
|---|---|
| 默认值 | — |
| 上下文 |
http, server, location |
定义一个包含变量的字符串,从中提取链接的校验和值和生命周期。
表达式 中使用的变量通常与请求关联;参见下面的 示例。
从字符串中提取的校验和值与由 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 |
|---|---|
| 默认值 | — |
| 上下文 |
http, server, location |
定义一个表达式,用于计算 MD5 哈希值并与请求中传递的值进行比较。
表达式应包含链接(资源)的安全部分和一个秘密成分。如果链接具有有限的生命周期,表达式还应包含 $secure_link_expires。
为了防止未经授权的访问,表达式可以包含一些关于客户端的信息,例如其地址和浏览器版本。
示例
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” 链接限制对“/s/link”的访问,对于 IP 地址为 127.0.0.1 的客户端。该链接也具有有限的生命周期,直到 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 |
|---|---|
| 默认值 | — |
| 上下文 |
location |
定义一个秘密 字符串,用于检查请求链接的真实性。
请求链接的完整 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- 链接检查的状态。具体值取决于所选的操作模式。
$secure_link_expires- 请求中传递的链接生命周期;仅用于 secure_link_md5 指令。