WEB服务与NGINX(19)- nginx 防盗链功能



1 nginx防盗链功能

1.1 盗链功能概述

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链。

防盗链由nginx的ngx_http_referer_module模块提供,使用的主要语法为valid_referers,具体说明如下:

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

    用于定义referer首部的合法可用值,不能匹配的将是非法值。

    支持环境:server, location

    参数说明

    • none:请求报文首部没有referer首部,一般为本地资源,比如浏览器直接输入域名访问就没有referer信息,需要设定为有效。

    • blocked:请求报文有referer首部,但没有有效值,比如为空。

    • server_names:referer首部中包含本主机名,即nginx监听的server_name。

    • arbitrary_string:任意字符串,但可使用*作通配符

    • regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如~.*\.xuzhichao\.com

  • $invalid_referer:nginx变量,表示无效的首部

referer字段示例:

使用搜狗直接搜索web网站然后点击访问就会生成referer信息:

image

在服务器上产生的日志如下,产生了referer信息。

{ "@timestamp": "2021-06-22T23:27:05+08:00", "remote_addr": "192.168.20.1", "referer": "https://www.sogou.com/sogou?prs=5&rfg=1&query=www.xuzhichao.com&pid=AQktG&ie=utf8", "request": "GET / HTTP/1.1", "status": 200, "bytes":27, "agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }

1.2 实现盗链

场景:www.nginx01.com网站盗取www.xuzhichao.com站点的一张图片。

www.xuzhichao.com站点的配置文件和图片页面如下:

#www.xuzhichao.com站点的配置文件:
server {
        listen 80;
        server_name www.xuzhichao.com;
        access_log /var/log/nginx/access_xuzhichao.log access_json;

        location / {
                root /data/nginx/html/xuzhichao;
                index index.html;
        }
}

#站点的main.html页面内容如下:
[root@nginx01 xuzhichao]# cat main.html 
<!DOCTYPE html>
<html>
    <head>
            <meta charset="UTF-8">
	    <title>www.xuzhichao.com</title>
	    <style type="text/css">
            /*清除所有标签的默认样式*/
            *{
                   padding: 0;
                   margin: 0;
             }
            .box1{
                   width: 1215px;
                   height: 700px;
                   background-image: url(css/earth.jpg);
             }
             p{
	           color: red;
	           font-size: 32px;
		   font-weight: bold;
	           font-family: "arial","华文彩云","微软雅黑",serif;
            }
            </style>
	        </head>
    <body>
           <p>这是"www.xuzhichao.com"的首页</p>
           <div class="box1"></div></body>
   </body>
</html>

#图片文件如下:
[root@nginx01 xuzhichao]# ll css/earth.jpg 
-rw-r--r-- 1 root root 101389 Jun 22 23:07 css/earth.jpg

用户访问该页面效果如下:

image

www.nginx01.com的配置文件和模拟盗链页面如下:

server {
	listen 80;
	server_name www.nginx01.com;
	charset utf-8,gbk;

	access_log /var/log/nginx/access_nginx01.log access_json;

	location / {
		root /data/nginx/html/web1;
		index index.html;
	}
}

#盗链页面
[root@nginx01 web1]# cat daolian.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>盗链页面</title>
	</head>
	
	<body>
		<a href="http://www.xuzhichao.com">盗链</a>
		<img src="http://www.xuzhichao.com/css/earth.jpg">
	</body>
</html>

客户端访问效果如下:

image

查看日志信息:

#www.nginx01.com站点的访问记录,请求/daolian.html页面,但是图片却是www.xuzhichao.com站点的
[root@nginx01 web1]# tail /var/log/nginx/access_nginx01.log
{ "@timestamp": "2021-06-22T23:52:41+08:00", "remote_addr": "192.168.20.1", "referer": "-", "request": "GET /daolian.html HTTP/1.1", "status": 200, "bytes":224, "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }

#www.xuzhichao.com站点的访问日志,referer字段显示了盗链地址,浪费了自己站点的流量为其他站点提供了服务。
[root@nginx01 web1]# tail /var/log/nginx/access_xuzhichao.log 
{ "@timestamp": "2021-06-22T23:52:41+08:00", "remote_addr": "192.168.20.1", "referer": "http://www.nginx01.com/", "request": "GET /css/earth.jpg HTTP/1.1", "status": 200, "bytes":101389, "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }

1.3 实现防盗链

在www.xuzhichao.com站点上实现防盗链功能。

#www.xuzhichao.com站点的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
server {
	listen 80;
	server_name www.xuzhichao.com;
	access_log /var/log/nginx/access_xuzhichao.log access_json;

	location / {
		root /data/nginx/html/xuzhichao;
		index index.html;
		
        #定义合法的referer信息,允许*.b.com  b.*以及百度,谷歌跳转;
		valid_referers none blocked server_names *.b.com  b.*  ~\.baidu\.  ~\.google\.;

		#对于不合法的referer信息返回403;
        if ( $invalid_referer ) {
			return 403;	
		}
	}
}

#重启nginx服务
[root@nginx01 ~]# systemctl reload nginx.service

客户端测试:

发现盗链的图片无法显示,返回403错误。

image

posted @ 2021-06-23 00:18  向往自由的独行者  阅读(304)  评论(0编辑  收藏  举报