Nginx secure_link防盗链模块

Nginx ngx_http_secure_link_module模块能够检查请求链接的权限以及是否过期,多用于下载服务器防盗链。

原理

1)加密串与过期时间作为url中的参数 2)nginx服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串 3)计算的加密串与url传递的加密串进行对比

开启ngx_http_secure_link_module

./configure --with-http_secure_link_module #编译nginx时加入 
  • 1

该模块提供两种工作模式:

模式一

通过配置 secure_link ,secure_link_md5 ,可实现对链接进行权限以及过期检查判断的功能。

secure_link

  • 语法 
    语法 : secure_link expression; 
    默认值: 无 
    配置段:http, server, location

  • 说明 
    expression由校验值 和 过期时间组成,其中校验值将会与 secure_link_md5中的指定参数的MD5哈希值进行对比,如果两个值不一致,$secure_link变量的值是空(empty),如果两个值一致,则进行过期检查,如果过期了,则$secure_link变量值是”0”,如果没过期,则为”1”. 
    如果链接是有时效性的,那么过期时间用时间戳进行设置,在MD5哈希值后面声明,用逗号隔开。如果没有设置过期时间,该链接永久有效。

secure_link_md5

  • 语法 
    语法 : secure_link_md5 expression; 
    默认值: 无 
    配置段:http, server, location

  • 说明 
    expression指定计算md5哈希值的参数,该md5值将会和url中传递的md5值进行对比校验。expression一般包含uri(如demo.com/s/link uri则为/s/link) 以及 加密 密钥secret,如果该链接具有时效,则expression需包含$secure_link_expires,expression还可以加入客户端信息,如访问IP,浏览器版本信息等.

实例

  • nginx配置

  • location /s/ {    secure_link $arg_md5,$arg_expires;    secure_link_md5 MySecret$arg_expires$uri;    if ($secure_link = "") {        return 403;    }    if ($secure_link = "0") {        return 410;    } }

  • 在UNIX系统中 MD5的值可由下面得出

    echo -n '2147483647/s/link127.0.0.1 secret' | \    openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

  • 在php中 拼接访问url

$secret = " secret";$uri = "/hls/cctv1.m3u8";$expire = time() + 300;$md5 = base64_encode(md5($expire.$uri.$secret,true));$md5 = strtr($md5, '+/', '-_');$md5 = str_replace('=', '', $md5);$url = "http://demo.com/hls/cctv1.m3u8?md5={$md5}&expires={$expire}";

模式二

通过配置 secure_link_secret 可实现对链接进行权限判断的功能。

secure_link_secret

  • 语法 
    语法 : secure_link word; 
    默认值: 无 
    配置段:http, server, location

  • 说明 
    使用一个加密字符串对访问路径进行鉴权

请求的链接形式如下

/prefix/hash/link

前缀是非斜杠的任意的字符串,哈希值是link与密钥secret的MD5值,link请求的路径

  • 实例

location /s/ {    secure_link_secret MySecret;    if ($secure_link = "") {        return 403;    }    rewrite ^ /helloworld/$secure_link; } location /helloworld/ {    return 503; }

如访问 
/s/fdb191a547321828363169ca530ee271/hello 
将会被重定向到 
/helloworld/hello

哈希值的计算方法 
md5(link.MySecret)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值