Nginx之防盗链功能

1.  盗链的实现原理

    客户端向服务器请求资源,服务器只包含网页的文本内容,客户端浏览器在解析文本的过程中发现有图片存在,但是图片的链接指向的是其他服务器,这样形成了盗链行为。

2.  防盗链的原理

    通过了解HTTP协议中的请求头部的Referer头域中的值是不是自己站点内的URL,就可以实现防盗链。

3.  如何防盗链

    1.  下载防盗链

        1.  nginx的配置

server {
  
    listen       80;
    server_name  x1.down.yangjianbo.com;
    access_log  /data/logs/nginx/x1.down.yangjianbo.com.access.log  main;
  
    index index.html index.php index.html;
    root /data/site/x1.down.yangjianbo.com;
  
    location / {
        secure_link $arg_st,$arg_e;
        secure_link_md5 yangjianbo.com$uri$arg_e;
  
        if ($secure_link = "") {
            return 403;
        }
  
        if ($secure_link = "0") {
            return 403;
        }
    }
} 

        2.  php下载页面

<?php
# 作用:生成nginx secure link链接
# 站点:www.yangjianbo.com
$secret = 'yangjianbo.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://x1.down.yangjianbo.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire.'>nginx-1.4.2</a>';
echo '<br>http://x1.down.yangjianbo.com/web/nginx-1.4.2.tar.gz?st='.$md5.'&e='.$expire;
?> 

        3.  测试nginx防盗链

            浏览器上打开http://test.yangjianbo.com/down.php点击上面的连接下载
            下载地址如下:
              http://x1.down.yangjianbo.com/web/nginx-1.4.2.tar.gz?st=LSVzmZllg68AJaBmeK3E8Q&e=1378881984
            页面不要刷新,等到5分钟后在下载一次,你会发现点击下载会跳转到403页面。

        4.  防盗链的过程

            1.  用户访问down.php
            2.  down.php根据secret密钥、过期时间、文件uri生成加密串
            3.  将加密串与过期时间作为参数跟到文件下载地址的后面
            4.  nginx下载服务器接收到了过期时间,也使用过期时间、配置里密钥、文件uri生成加密串
            5.  将用户传进来的加密串与自己生成的加密串进行对比,一致允许下载,不一致403
            整个过程实际上很简单,类似于用户密码验证. 尤为注意的一点是一定不要泄露了自己的密钥,否则别人就可以盗链了,除了泄露之外最好能经常更新密钥.

        5.  secure link指令

            1.  secure_link

                语法: secure_link md5_hash[,expiration_time]
                默认: none
                配置段: location
                variables: yes
                这个指令由uri中的MD5哈希值和过期时间组成. md5哈希必须由base64加密的,过期时间为unix时间.如果不加过期时间,那么这个连接永远都不会过期.

            2.  secure_link_md5

                语法: secure_link_md5 secret_token_concatenated_with_protected_uri
                默认: none
                配置段: location
                variables: yes
                md5值对比结果,使用上面提供的uri、密钥、过期时间生成md5哈希值.如果它生成的md5哈希值与用户提交过来的哈希值一致,那么这个变量的值为1,否则为0

        6.  限制多线程下载

            作用域: server location
            if ($http_range)
            {
              return 405;
            }                

    2.  图片防盗链

        1.  valid_referers指令  

            用来获取Referer头域中的值。如果Referer头域中没有符合valid_referers指令配置的值,$invalid_referer变量将会被赋值为1.

            语法结构:

              valid_referers none | blocked | server_names | string ...;

              none  检测Referer头域不存在的情况

              blocked  检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况下,该头域的值不以http://或者https://开头

              server_names  设置一个或多个URL

        2.  针对不同类型的图片防盗链

location ~* \.(gif|jpg|png|bmp)$ {
      valid_referers none blocked *.yangjianbo.com server_names ~\.google\. ~\.baidu\.;
      if ($invalid_referer) {
         return 403;
        #rewrite ^/ http://www.yangjianbo.com/403.jpg;
      }
}

        3.  禁止浏览器直接访问图片和下载图片,并设置过期时间

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
  valid_referers *.yangjianbo.com wangshibo.com;
  if($invalid_referer) {
    rewrite ^/ http://www.yangjianbo.com/404.jpg;
    #return404;
    }
  expires 30d;
}

        4.  针对目录的防盗链

location /img/ {
root /data/img/;
valid_referers none blocked *.yangjianbo.com yangjianbo.com;
if($invalid_referer){
rewrite ^/ http://www.yangjianbo.com/images/error.gif;
#return 403;
}
}

location /images/ {
alias /data/images/;
valid_referers none blocked server_names *.yangjianbo.com yangjianbo.com ;
if ($invalid_referer) {
return 403;
}
}

  

  

  

            

  

            

posted @ 2022-11-17 10:49  奋斗史  阅读(455)  评论(0)    收藏  举报