nginx secure_link下载防盗链
下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷、flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效,如果你是nginx的话,使用secure link完美解决这个问题,远离迅雷.本文仅用于下载服务器,不适用于图片防盗链.
安装nginx
默认情况下nginx不会安装secure_link模块,需要手动指定,配置参数如下
1
2
3
4
|
# ./configure --with-http_secure_link_module \
--
prefix
=
/
usr
/
local
/
nginx
-
1.4.2
--
with
-
http_stub_status_module
# make
# make install
|
配置nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
server
{
listen
80
;
server
_name
s1
.
down
.
ttlsa
.
com
;
access
_log
/
data
/
logs
/
nginx
/
s1
.
down
.
ttlsa
.
com
.
access
.
log
main
;
index
index
.
html
index
.
php
index
.
html
;
root
/
data
/
site
/
s1
.
down
.
ttlsa
.
com
;
location
/
{
secure
_link
$
arg_st
,
$
arg_e
;
secure_link_md5
ttlsa
.
com
$
uri
$
arg_e
;
if
(
$
secure_link
=
""
)
{
return
403
;
}
if
(
$
secure_link
=
"0"
)
{
return
403
;
}
}
}
|
php下载页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
# 作用:生成nginx secure link链接
# 站点:www.ttlsa.com
# 作者:凉白开
# 时间:2013-09-11
$secret
=
'ttlsa.com'
;
# 密钥
$path
=
'/web/nginx-1.4.2.tar.gz'
;
# 下载文件
# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
$expire
=
time
(
)
+
300
;
# 用文件路径、密钥、过期时间生成加密串
$md5
=
base64_encode
(
md5
(
$secret
.
$path
.
$expire
,
true
)
)
;
$md5
=
strtr
(
$md5
,
'+/'
,
'-_'
)
;
$md5
=
str_replace
(
'='
,
''
,
$md5
)
;
# 加密后的下载地址
echo
'<a href=http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st='
.
$md5
.
'&e='
.
$expire
.
'>nginx-1.4.2</a>'
;
echo
'<br>http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st='
.
$md5
.
'&e='
.
$expire
;
?>
|
测试nginx防盗链
打开http://test.ttlsa.com/down.php点击上面的连接下载
下载地址如下:
http://s1.down.ttlsa.com/web/nginx-1.4.2.tar.gz?st=LSVzmZllg68AJaBmeK3E8Q&e=1378881984
页面不要刷新,等到5分钟后在下载一次,你会发现点击下载会跳转到403页面。
secure link 防盗链原理
- 用户访问down.php
- down.php根据secret密钥、过期时间、文件uri生成加密串
- 将加密串与过期时间作为参数跟到文件下载地址的后面
- nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串
- 将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致403
整个过程实际上很简单,类似于用户密码验证. 尤为注意的一点是大家一定不要泄露了自己的密钥,否则别人就可以盗链了,除了泄露之外最好能经常更新密钥.
secure link 指令
secure_link
语法: secure_link md5_hash[,expiration_time]
默认: none
配置段: location
variables: yes
这个指令由uri中的MD5哈希值和过期时间组成. md5哈希必须由base64加密的,过期时间为unix时间.如果不加过期时间,那么这个连接永远都不会过期.
secure_link_md5
语法: secure_link_md5 secret_token_concatenated_with_protected_uri
默认: none
配置段: location
variables: yes
md5值对比结果,使用上面提供的uri、密钥、过期时间生成md5哈希值.如果它生成的md5哈希值与用户提交过来的哈希值一致,那么这个变量的值为1,否则为0
secure_link_secret
语法: secure_link_secret word
默认:
配置段: location
Reference: secure_link_secret
nginx 0.8.50之后的版本已经使用secure_link_md5取代,不在多说.
注意事项
- 密钥防止泄露、以及经常更新密钥
- 下载服务器和php服务器的时间不能相差太大,否则容易出现文件一直都是过期状态.
最后
secure link以及内置到了nginx,不需要额外安装第三方模块,有下载服务器的兄弟,我极力推荐你们使用它,除非你不在乎你的带宽.
成长的对话版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!