网站中有下载压缩包等资源,但是这些资源都是对会员公开的,需要设定有效期。这里就需要做到防盗链的功能。
以前仅仅使用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服务器的时间不能相差太大,否则容易出现文件一直都是过期状态。
友情提示:垃圾评论一律封号...