nginx防盗链
在实际生产过程中,我们线上的图片等静态资源,经常会被其他网站盗用,他们发大财的同时,成本确实我们在买单,下面来说下,如何杜绝这种行为。
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
防盗链配置(例)
# vim /etc/nginx/nginx.conf
location ~ .*\.(gif|jpg|png|jpeg)$ {
root /usr/share/nginx/html;
valid_referers newrain.wang 10.10.10.10;
if ($invalid_referer) {
return 403;
}
}
- valid_referers 设置访问白名单
- none : 允许没有http_refer的请求访问资源;
- blocked : 允许不是http://开头的,不带协议的请求访问资源;
- server_names : 只允许指定ip/域名来的请求访问资源(白名单);
防盗链实例
两台nginx 服务器
nginx1
# vim /etc/nginx/conf.d/nginx.conf
server {
listen 80;
server_name localhost;
location / {
root /usr/local/nginx/html;
index index.html index.htm;
valid_referers none blocked 192.168.0.227 121.36.59.58 *.qf.com;
if ($invalid_referer) {
rewrite ^/ https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1591516652&di=d50907c9c37b1d33ebb3ba43a9c6de9c&src=http://a2.att.hudong.com/36/48/19300001357258133412489354717.jpg;
#return 403;
}
}
location ~ .*\.(gif|jpg|png|jpeg)$ {
root /usr/local/nginx/html;
valid_referers 192.168.0.227 121.36.59.58 *.qf.com;
if ($invalid_referer) {
rewrite ^/ https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1591516652&di=d50907c9c37b1d33ebb3ba43a9c6de9c&src=http://a2.att.hudong.com/36/48/19300001357258133412489354717.jpg;
#return 403;
}
}
}
# vim /usr/local/nginx/html/index.html
<html>
<head>
<meta charset="utf-8">
<title>qf.com</title>
</head>
<body style="background-color:red;">
<img src="./a.jpg"/>
</body>
</html>
nginx2
<html>
<head>
<meta charset="utf-8">
<title>qf.com</title>
</head>
<body style="background-color:red;">
<img src="http://121.36.59.58/a.jpg"/>
</body>
</html>
nginx2 curl 测试
# curl http://121.36.59.58
<html>
<head>
<meta charset="utf-8">
<title>qf.com</title>
</head>
<body style="background-color:red;">
<img src="./a.jpg"/>
</body>
</html>
# curl -e http://www.baidu.com http://121.36.59.58
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.16.0</center>
</body>
</html>
# curl -e http://121.36.59.58 http://121.36.59.58
<html>
<head>
<meta charset="utf-8">
<title>qf.com</title>
</head>
<body style="background-color:red;">
<img src="./a.jpg"/>
</body>
</html>
浏览器测试
这是我们发现,直接访问我们的网站是可以的,访问盗链网站就会被rewrite到一个特殊的图片。
由上面的实验我们得到结论
valid_referers 后面可以指定的参数
1 none 说的通俗一点就是允许资源可以直接通过浏览器访问,不加则返回 $invalid_referer 的内容
2 blocked 指的是可以允许不通过http协议的访问,也就是说,如果我们curl -e '' http://121.36.59.58 是可以访问的 ,curl -e 'www.baidu.com' http://121.36.59.58 也是可以的,但是 curl -e 'http:www.baidu.com' http://121.36.59.58 就不可以了,因为我们在配置文件中允许了http头信息中可以带有不是http开头的访问。