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; #仅内部使用
}