nginx 防盗链详解

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开头的访问。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值