Module ngx_http_secure_link_module

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配置参数启用它。

Directives

Syntax:secure_link expression;
Default:
Context:http , server , location

定义一个带有变量的字符串,从中将提取链接的校验和值和生存期。

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

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

如果链路的生存期有限,则自 Epoch(1970 年 1 月 1 日,星期四,格林尼治标准时间)开始,以秒为单位设置到期时间。该值在 MD5 哈希之后的表达式中指定,并用逗号分隔。可通过$secure_link_expires变量获得在请求中传递的到期时间,以在secure_link_md5指令中使用。如果未指定到期时间,则链接具有无限的生存期。

Syntax:secure_link_md5 expression;
Default:
Context:http , server , location

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

表达式应包含链接(资源)的安全部分和 Secret 成分。如果链接的生存期有限,则表达式还应包含$secure_link_expires

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

Example:

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 =

Syntax:secure_link_secret word;
Default:
Context:location

定义用于检查请求链接的真实性的 Secretword

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

/prefix/hash/link

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

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

Example:

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

Embedded Variables

  • 链接检查的状态。具体值取决于所选的操作模式。
  • 请求中传递的链接的生存期;只能在secure_link_md5指令中使用。