NGINX_十一 nginx 防盗链问题

十一 nginx 防盗链问题

两个网站 A 和 B, A网站引用了B网站上的图片,这种行为就叫做盗链。 防盗链,就是要防止A引用B的图片。

1、nginx 防止网站资源被盗用模块

ngx_http_referer_module

如何区分哪些是不正常的用户?

​ HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。 因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.

比如在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=http://www.google.com

2、防盗链配置

配置要点:

[root@nginx-server ~]# vim /etc/nginx/nginx.conf
# 日志格式添加"$http_referer"
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';
# valid_referers 使用方式                         
Syntax: 	valid_referers none | blocked | server_names | string ...;
Default: 	—
Context: server, location
  • none : 允许没有http_refer的请求访问资源;

  • blocked : 允许不是http://开头的,不带协议的请求访问资源;

  • server_names : 只允许指定ip/域名来的请求访问资源(白名单);

    准备两台机器,两张图片(缓存问题)

    配置nginx配置文件,并上传图片
    [root@nginx-server html]# vim /etc/nginx/conf.d/nginx.conf
    server {
        listen       80;
        server_name  localhost;
    
        location / {
             root   /usr/share/nginx/html;
             index  index.html index.htm;
    
             valid_referers none blocked *.qf.com 10.0.105.202;
                    if ($invalid_referer) {
                       return 502;
                    }
            }
        location ~  .*\.(gif|jpg|png|jpeg)$ {
             root  /usr/share/nginx/html;
    
             valid_referers  qf.com 10.0.105.202;
                    if ($invalid_referer) {
                       return 403;
                    }
            }
    }
    
    重载nginx服务
    [root@nginx-server ~]# nginx -s reload -c /etc/nginx/nginx.conf
    
    
    第二台机器客户端
    配置nginx访问页面
    创建页面
    [root@nginx-server nginx]# vim index.html
    <html>
    <head>
        <meta charset="utf-8">
        <title>qf.com</title>
    </head>
    <body style="background-color:red;">
        <img src="http://10.0.105.202/test.jpg"/>
    </body>
    </html>
    
    测试不带http_refer:
    [root@nginx-server nginx]# curl -I "http://10.0.105.202/test1.png"
    HTTP/1.1 200 OK
    Server: nginx/1.16.0
    Date: Thu, 27 Jun 2019 16:21:13 GMT
    Content-Type: image/png
    Content-Length: 235283
    Last-Modified: Thu, 27 Jun 2019 11:27:11 GMT
    Connection: keep-alive
    ETag: "5d14a80f-39713"
    Accept-Ranges: bytes
    
    测试带非法http_refer:
    [root@nginx-server nginx]# curl -e http://www.baidu.com -I "http://10.0.105.202/test.jpg"
    HTTP/1.1 403 Forbidden
    Server: nginx/1.16.0
    Date: Thu, 27 Jun 2019 16:22:32 GMT
    Content-Type: text/html
    Content-Length: 153
    Connection: keep-alive
    
    测试带合法的http_refer:
    [root@nginx-server nginx]# curl -e http://10.0.105.202 -I "http://10.0.105.202/test.jpg"
    HTTP/1.1 200 OK
    Server: nginx/1.16.0
    Date: Thu, 27 Jun 2019 16:23:21 GMT
    Content-Type: image/jpeg
    Content-Length: 27961
    Last-Modified: Thu, 27 Jun 2019 12:28:51 GMT
    Connection: keep-alive
    ETag: "5d14b683-6d39"
    Accept-Ranges: bytes
    
    

3、其他配置

3.1、匹配域名

#    location ~  .*\.(gif|jpg|png|jpeg)$ {
#        root  /usr/share/nginx/html;

#         valid_referers none blocked qf.com 10.0.105.202;
#               if ($invalid_referer) {
#                  return 403;
#               }
#       }
    location ~ .*\.(gif|jpg|png|jpeg)$ {
        root  /usr/share/nginx/html;

        valid_referers 10.0.105.202 *.baidu.com *.google.com;
                if ($invalid_referer) {
                rewrite ^/ http://10.0.105.202/test.jpg;
                #return 403;
                }
        }

以上所有来自 qf.com 和域名中google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值