我怎么敢倒下,我身后空无一人

nginx如何配置secure_link完成文件防盗链功能

 Nginx   高蒙   阅读(1143)   评论(4)   2017-11-17 10:13:42    secure_link nginx 防盗链 


网站中有下载压缩包等资源,但是这些资源都是对会员公开的,需要设定有效期。这里就需要做到防盗链的功能。

以前仅仅使用Referer验证,只能防止一些小白的盗链,对于一些工具来说一点用都没有。

但是在nginx下,可以使用secure_link完美的来解决这个问题。这里针对的只是文件下载防盗链,不适用于图片的防盗链。

一、配置nginx。

server {
    listen       80;
    server_name  www.web1.com;
    location / {
        index index.html index.php index.html;
        root /data/www;
    }
    location ~* \.(rar|zip|7z|tar)?$ {
        root   /data/www;
        secure_link $arg_st,$arg_e;
        secure_link_md5 segredo$uri$arg_e;
        if ( $secure_link = "" ) {
            return 403;
        }
        if ( $secure_link = "0" ) {
            return 403;
        }
    }
    
    ##其他配置省略##
    ......
}

二、php代码生成下载地址。

## 密钥 ##
$secret = 'segredo'; 

## 下载文件 ##  切记路径带上/
$path   = "/zip/a.zip";

## 下载到期时间,time是当前时间,$validtime表示有效期,也就是说从现在到300秒之内文件不过期 ##
$validtime = 300;
$expire = time() + $validtime; 

## 用文件路径、密钥、过期时间生成加密串 ##
$md5 = base64_encode(md5($secret . $path . $expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);

## 加密后的下载地址 ##
$uri = $path . '?st=' . $md5 . '&e=' . $expire;

##  安全下载链接可以直接echo输出  ##
$uri = "http://www.web1.com".$uri;
echo $uri;

只要将上面的地址,粘贴到浏览器即可验证。

三、secure link防盗链原理。

  • 1、首先拿到php根据secret密钥、过期时间、文件uri生成加密串。

  • 2、将加密串与过期时间作为参数跟到文件下载地址的后面。

  • 3、nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串。

  • 4、将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致403。

整个过程实际上很简单,类似于用户密码验证. 尤为注意的一点是大家一定不要泄露了自己的密钥,否则别人就可以盗链了,除了泄露之外最好能经常更新密钥。

注意事项

  • 密钥防止泄露、以及经常更新密钥。

  • 下载服务器和php服务器的时间不能相差太大,否则容易出现文件一直都是过期状态。





相关文章



我要评论


站长昵称:(*)

输入内容:


评论列表


高蒙

男,程序猿一枚

 

人生要是没有理想, 那跟一条咸鱼有什么分别。


关于我

  http://www.shuchengxian.com

高蒙个人博客是以PHP技术为主的程序员个人博客。博客主要发布php开发中遇到的问题以及解决办法,同时个人博客也分享网站模板素材,jquery插件等方面素材。


站点声明:相关侵权、举报、投诉及建议等,请发E-mail:936594075#qq.com(#替换成@)。

Copyright © 2018, www.shuchengxian.com, All rights reserved. 个人博客皖公网安备 34152302000022号 皖ICP备15015490号

关键词:个人博客,PHP博客,PHP博客程序,高蒙博客,高蒙个人博客,php程序员博客,程序员个人博客