Nginx 防盗链secure_link模块

secure_link模块名称ngx_http_secure_link_module,默认未编译进nginx,需要通过–with-http_secure_link_module编译进nginx。

功能:通过验证URL中哈希值的方式防盗链

1、由某服务器(也可以是nginx)生成加密后的安全连接url,返回给客户端。2、客户端使用安全url访问nginx,由nginx的secure_link变量判断是否验证通过 。

原理:

1、哈希算法是不可逆的
2、客户端只能拿到执行过哈希算法的URI
3、仅生成URL的服务器、验证URL是否安全的nginx这二者,才保存执行哈希算法前的原始字符串。
4、原始字符串通常由以下部分有序组成:
   a、资源位置,例如HTTP中指定资源的URI,防止攻击者难道一个安全URL后可以访问任意资源。
   b、用户信息,例如用户IP地址,限制其他用户盗用安全URL。
   c、时间戳,使安全URL及时过期。
   d、密钥,仅服务器端拥有,增加攻击者猜测出原始字符串的难度。

secure_link模块指令

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

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

Syntax: secure_link_secret word;
Default: ---
Context: location

secure模块变量

$secure_link

1、值为空字符串;验证不通过
2、值为0 ; URL过期
3、值为1 ; 验证通过

$secure_link_expires

时间戳的值

secure_link模块第一种方式: md5和时间戳

1、原始请求 : /test.html?md5=md5值&expires=时间戳 (注:时间戳用来定义有效期,要大于当前的时间,否则会验证不通过)

2、生成md5: echo -n ‘时间戳URL客户端IP 密钥’ |openssl md5 -binary |openssl base64 | tr +/- |tr -d=

3、nginx配置 : secure_link $arg_md5,$arg_expires; secure_link_md5 “$secure_link_expires$uri$remote_addr secret”;

配置示例:

server {
server_name localhost;
error_log logs/error.log info;
default_type text/plain;

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

return 200 "$secure_link:$secure_link_expires";
}
}

secure_link模块第一种方式: 对URL哈希

1、将请求URL分为三个部分: /prefix/hash/link

2、Hash生成方式 : 对”link密钥” 做md5哈希求值 , echo -n “linksecret” |openssl md5 -hex

3、用secure_link_secret secret: 配置密钥 , ecure_link_secret secret;

配置示例:

location /p/ {  #/p 作为前缀
secure_link_secret mysecret2;

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

rewrite ^ /secure/$secure_link;
# ^匹配所有URL , $secure_link 访问连接中link的值
}

location /secure/ {
alias html/;
internal; #仅内部使用
}
上一篇:
下一篇:

添加评论

电子邮件地址不会被公开。 必填项已用*标注