基础知识
防盗链配置
配置要点:
[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 使用方式
#valid:有效的
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
-
none : 允许没有http_refer的请求访问资源,允许直接访问我的资源;
-
blocked : 允许不是http://开头的,不带协议的请求访问资源;
-
server_names : 只允许指定ip/域名来的请求访问资源(白名单);
none和blocked一起使用,允许通过网站直接访问我的图片资源
准备两台机器,两张图片(缓存问题)
配置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 403; } } 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
5、其他配置
5.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这个规则。
实验操作
服务器:172.17.0.6
盗链服务器:172.17.0.7
1、服务器没有设置防盗链,服务器有一个图片.a.jpg
172.17.0.6的网站发布目录
浏览器访问测试
图片显示正常,跳转baidu正常
查看访问日志
发现不带http_referer,就是正常访问
盗链网站的网站发布目录
浏览器访问盗链网站
图片正常,跳转正常,盗链成功
被盗服务器访问日志
http_referer是172.17.0.7
访问是跳转链接,发现被盗链,开启防盗链