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信息:
在服务器上产生的日志如下,产生了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
用户访问该页面效果如下:
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>
客户端访问效果如下:
查看日志信息:
#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错误。