配置Nginx的防盗链,实现网站资源防盗

前言

  在项目中,经常会有不想让本站点的静态资源被他人盗取访问的需求。比如网站中的图片,前端加载的一些js文件等。此时,就可以配置nginx的防盗链来实现网站资源的防盗。
  当然,此方案的前提是前端资源的访问是经过nginx的。


一、配置防盗链之前的效果

1. nginx原始配置

  nginx部分配置如下,会将域名的请求转发到实际服务器上

location ^~ /test/ {
    proxy_pass http://test;
    proxy_set_header Host $host:$server_port;
    proxy_connect_timeout 3000s;
    proxy_send_timeout 3000s;
    proxy_read_timeout 3000s;
}

2. 访问站点

  如图,是可以正常加载背景图的,F12中可以看到js加载状态也为200正常
站点图
在这里插入图片描述

3. 拷贝链接访问

  将图片和js地址拷贝到浏览器中访问,可以看到也是可以正常访问的。
  某些要求严格的项目,会认为这样是不安全的,需要加以限制,让资源只能在本站点中可以看到。如此,就引出下文的nginx防盗链了。
在这里插入图片描述
在这里插入图片描述


二、配置Nginx的防盗链

1. 修改nginx配置

  由于本示例项目中的静态资源都在static目录下,所以先拷贝原有的nignx代理块,将拦截路径改为“/test/static”,即拦截掉所有静态资源。然后再配置valid_referers,设置允许访问此资源的地址,多个地址之间用空格分隔(本示例中为10.0.11.89remotebank.utry.cn)。最后再增加一个判断,不在此地址范围内的请求予以拦截并返回403。
  新增的关键代码为:

# 设置可以访问静态资源的地址
valid_referers 10.0.11.89 remotebank.utry.cn;
# 如果不是白名单则 显示403 禁止访问
if ($invalid_referer) {
   return 403;
}

  修改后的结果如下图:
在这里插入图片描述

2. 修改后,访问站点

  在站点内访问,如下图所示,还是可以正常加载背景图和js文件的。说明业务是可以正常使用的。
在这里插入图片描述
在这里插入图片描述

3. 修改后,拷贝链接访问

  将图片和js地址拷贝出来到浏览器中访问,显示403。
  此时已经实现了不让外部访问本站点的静态资源了
在这里插入图片描述

在这里插入图片描述

三、说明

1. http请求头的referer

  简单来说,Referer是HTTP协议中的一个请求报头,用于告知服务器用户的来源页面。比如说你从Google搜索结果中点击进入了某个页面,那么该次HTTP请求中的Referer就是Google搜索结果页面的地址。如果你的博客中引用了其他地方的一张图片,那么对该图片的HTTP请求中的Referer就是你那篇博客的地址。
在这里插入图片描述
  本文中的方案,其实是用nginx获取http请求头中的referer,判断其是否在白名单内。如果不在,则不予放行,返回403。
  在站点内加载资源的时候,请求头中是会带上本站点的地址的。而拷贝链接到浏览器中执行时,请求头中不会有refer,也就会被拦截掉了。
  需要注意的是,请求头中的referer是很容易在代码中伪造的,因此这种方案是有一定局限性的

2. nginx的valid_referers

  nginx的valid_referers语法格式为:valid_referers [none|blocked|server_names] ...

该指令的参数可以为下面的内容:

  • node:表示无Referer值的情况
  • blocked:表示Referer值被防火墙进行伪装
  • server_names:表示一个或多个主机名称

  该指令会根据http请求头中的Referer值进行判断,若符合valid_referers设定的规则,则给变量$invalid_referer赋值为0,否则赋值为1。


总结

  本文介绍了通过配置nginx的valid_referers,使用http请求头中的Referer值来判断静态资源是否可以被访问的方法。需要注意的是,referer是可以伪造的,因此本方案是有一定局限性的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值