使用nginx secure_link指令实现下载防盗链

一、安装nginx并检查是否已安装模块

[root@img_server ~]# nginx -V #输出nginx所有已安装模块,检查是否有ngx_http_secure_link_module

二、配置nginx

[root@img_server ~]# vim /etc/nginx/conf.d/dowm_img_safe.conf 
server {
        listen       80;
        server_name  img_server;
        root         /usr/share/nginx/html/;

    location / {
        secure_link $arg_md5,$arg_expires;  #这里配置了2个参数一个是arg_md5,一个是arg_expires
        secure_link_md5 "$secure_link_expires$uri secret_key"; #secret_key为自定义的加密串   
    if ($secure_link = "") {
        return 403;       #资源不存在或哈希比对失败
        }
    if ($secure_link = "0") {
        return 403;      #时间戳过期 
        }
      if ($request_filename ~* ^.*?\.(jpg)$){
        add_header Content-Disposition attachment;  #不浏览,直接下载
}
        }

        }

三、使用shell脚本生成下载的链接(生产环境由开发在代码中实现)

[root@img_server html]# cat md5url.sh 
#!/bin/bash
servername="img_server"  #服务器的域名
download_file="/test.jpg" #测试下载文件的uri
time_num=$(date -d "+300 seconds" +%s) #定义过期时间为300秒
secret_num="secret_key" #自定义的加密串,和nginx的配置文件中加密串相同
res=$(echo -n "${time_num}${download_file} ${secret_num}"|openssl md5 -binary|openssl base64|tr +/ -_|tr -d =)  #生成MD5值
echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}" #打印下载链接

四、测试

[root@img_server html]# chmod +x md5url.sh  #添加权限
[root@img_server html]# systemctl start nginx #启动服务
[root@img_server html]# wget http://pic17.huitu.com/res/20140314/526868_20140314230121822200_1.jpg
[root@img_server html]# mv 526868_20140314230121822200_1.jpg test.jpg #下载一个图片,并命名为test.jpg

1.测试直接访问(测试机器需要添加域名解析)

访问结果为403

2.使用生成的下载链接进行访问

[root@img_server html]# sh md5url.sh 
http://img_server/test.jpg?md5=oa63dd5x_yi_E_eJLsAhHQ&expires=1523007651

过五分钟(即脚本中300秒)再次访问,返回410

注意事项

1 密钥防止泄露、以及经常更新密钥
2 下载服务器和链接生成的服务器上的时间不能相差太大,否则容易出现文件一直都是过期状态.

 

posted @ 2018-04-06 17:43  百衲本  阅读(3554)  评论(1编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码