最新消息:本站所有跳转向bbs.ykit.cn的附件将全面停止,附件已转移到https://www.qingsj.com

Nginx模块参考手册:Secure Link模块(Secure Link)

nginx 有客 1108浏览

如果要使用这些模块,则必须在编译时指定相关的编译参数。

这个模块为一个必需的安全性令牌检查请求网址。
要使用这个模块必须在编译时指定下列编译参数(0.7.18后版本可用):

--with-http_secure_link_module

示例配置:

location /prefix/ {
    secure_link_secret secret_word;
 
    #如果哈希不正确$secure_link将为一个空字符串。
    if ($secure_link = "") {
        return 403;
    }
 
    #需要下面这条设置,否则会得到404错误。
    rewrite ^ /prefix/$secure_link break;
}

0.8.50+版本示例 – 更优的处理MD5哈希与增加过期头

在Nginx-0.8.50,这个模块增加了”secure_link_md5“指令和”secure_link_expires“变量,”secure_link_secret“指令已经不推荐使用。
下面这个例子表示这是一个从今天起(December 22 2010)一整年都可以访问的安全连接,它在uri中指定了MD5和过期时间:

http://example.com/p/files/top_secret.pdf?st=vXjVzvGW4363YG1I6vb11A&e=13245277231161

在php里面可以使用下面命令得到哈希值:

php -r ‘print  str_replace(“=”, “”,\
strtr(base64_encode(md5(“segredo/p/files/top_secret.pdf13245277231161”, TRUE)), “+/”, “-_”)) . “\n”;’

这样就可以得到一个哈希,当然在web应用中应该让它自动生成,注意MD5哈希是二进制形式。
过期时间可以通过php中的time()函数生成,

location /p/ {
    ## 必须用MD5哈希和过期时间匹配URI
    secure_link $arg_st,$arg_e; #必须匹配URI部分
 
    ## 使用一个加密标记,URI和一个过期时间生成md5
    secure_link_md5 segredo$uri$arg_e; # 'segredo'是加密标记
 
    ## 如果哈希不正确$secure_link为空字符串
    if ($secure_link = "") {
        return 403;
    }
 
    ## 如果当前的时间晚于指定的过期时间
    if ($secure_link = "0") {
        return 403;
    }
 
    ## 一切正确的话$secure_link为1
    ## 这条设置是必须的,否则你将得到404
    rewrite ^/p/(.*)$ /p/$1 break;
}

指令

secure_link_secret

语法:secure_link_secret secret_word
默认值:none
使用字段:location
指令为审核请求指定一个秘密字段,一个被保护连接的完整网址如下:
/prefix/MD5 hash/reference
在secret指令中指定的secret_word将被计算为一个MD5值而串联到受保护的链接中,例如:受保护的文件top_secret_file.pdf位于目录p。nginx配置为:

location /p/ {
    secure_link_secret segredo;
 
    if ($secure_link = "") {
        return 403;
    }
 
    rewrite ^ /p/$secure_link break;
}

你可以通过openssl命令来计算MD5值:

echo -n 'top_secret_file.pdfsegredo' | openssl dgst -md5

得到的值为0849e9c72988f118896724a0502b92a8。可以通过下面首保护的连接访问:

http://example.com/p/0849e9c72988f118896724a0502b92a8/top_secret_file.pdf

注意,不能使用跟路径,即/,例如:

location / {
   #不能使用/
   secure_link_secret segredo;
   [...]
}

secure_link

语法:secure_link $md5_hash[,$expire_time]
默认值:none
使用字段:location
这个指令指定这个链接URL的MD5哈希值和过期时间,$md5_hash为基于URL的64位编码,$expired_time为自1970-01-01 00:00:00 UTC时间以来的秒数,如果你不增加$expire_time,那么这个URL永远不会过期。

secure_link_md5

语法:secure_link_md5 $the_uri_you_want_to_hashed_by_md5
默认值:none
使用字段:location
这个指令指定你需要通过MD5哈希的字符串,字符串可以包含变量,哈希值将和”secure_link”设置的$md5_hash变量进行比较,如果结果相同,$secure_link变量值为1,否则为空字符串。

变量

$secure_link

根据你是否使用”secure_link_secret”,这个值有两个不同的意义:

  • 如果使用”secure_link_secret”,并且验证的URL通过验证,这个值为true,否则为空字符串。
  • 如果使用”secure_link”和”secure_link_md5”。并且验证的URL通过验证$secure_link为’1’。如果本地时间超过$expire_time, $secure_link值为’0’。否则,将为空字符串。

$secure_link_expires

等于变量$expire_time的值。

转载请注明:有客帮 » Nginx模块参考手册:Secure Link模块(Secure Link)