nginx secure_link模块下载防盗链
下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷、flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效,如果你是nginx的话,使用secure link完美解决这个问题,远离迅雷.本文仅用于下载服务器,不适用于图片防盗链.
1. 安装nginx(编译secure link模块)
默认情况下nginx不会安装secure_link模块,需要手动指定,配置参数如下:
1# ./configure --with-http_secure_link_module \
2--prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module
3# make
4# make install
2. nginx配置
1server {
2 listen 80;
3 server_name s1.down.361way.com;
4 access_log /data/logs/nginx/s1.down.361way.com.access.log main;
5 index index.html index.php index.html;
6 root /data/site/s1.down.361way.com;
7 location / {
8 secure_link $arg_st,$arg_e;
9 secure_link_md5 361way.com$uri$arg_e;
10 if ($secure_link = "") {
11 return 403;
12 }
13 if ($secure_link = "0") {
14 return 403;
15 }
16 }
17}
3. php下载页面
1<?php
2# 作用:生成nginx secure link链接
3# 站点:www.361way.com
4
5 $secret = '361way.com'; # 密钥
6 $path = '/web/nginx-1.4.2.tar.gz'; # 下载文件
7# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
8 $expire = time()+300;
9# 用文件路径、密钥、过期时间生成加密串
10 $md5 = base64_encode(md5($secret . $path . $expire, true));
11 $md5 = strtr($md5, '+/', '-_');
12 $md5 = str_replace('=', '', $md5);
13# 加密后的下载地址
14 echo '<a href=http://s1.down.361way.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire.'>nginx-1.4.2</a>';
15 echo '<br>http://s1.down.361way.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire;
16 ?>
4. 测试nginx防盗链
打开 http://test.361way.com/down.php 点击上面的连接下载,下载地址如下:http://s1.down.361way.com/web/nginx-1.4.2.tar.gz?st=LSVzmZllg68AJaBmeK3E8Q&e=1378881984 页面不要刷新,等到5分钟后在下载一次,你会发现点击下载会跳转到403页面。
5. secure link 防盗链原理
- 用户访问down.php
- down.php根据secret密钥、过期时间、文件uri生成加密串
- 将加密串与过期时间作为参数跟到文件下载地址的后面。
- nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串 将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致返回403
整个过程实际上很简单,类似于用户密码验证. 尤为注意的一点是大家一定不要泄露了自己的密钥,否则别人就可以盗链了,除了泄露之外最好能经常更新密钥.
6.secure link 指令
1secure_link
2语法: secure_link md5_hash[,expiration_time]
3默认: none
4配置段: location
5variables: yes
这个指令由uri中的MD5哈希值和过期时间组成. md5哈希必须由base64加密的,过期时间为unix时间.如果不加过期时间,那么这个连接永远都不会过期.
1secure_link_md5
2语法: secure_link_md5 secret_token_concatenated_with_protected_uri
3默认: none
4配置段: location
5variables: yes
md5值对比结果,使用上面提供的uri、密钥、过期时间生成md5哈希值.如果它生成的md5哈希值与用户提交过来的哈希值一致,那么这个变量的值为1,否则为0
1secure_link_secret
2语法: secure_link_secret word
3默认:
4配置段: location
5Reference: secure_link_secret
nginx 0.8.50之后的版本已经使用secure_link_md5取代,不在多说.
7. 其他
密钥防止泄露、经常更新密钥 ,下载服务器和php服务器的时间不能相差太大,否则容易出现文件一直都是过期状态. secure link已内置到了nginx,不需要额外安装第三方模块,有下载服务器的兄弟,我极力推荐你们使用它,除非你不在乎你的带宽.
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/nginx-secure-link/4364.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.