Nginx静态资源防盗链

什么是资源防盗链

资源防盗链是一种网络安全机制,用于防止未授权的网站或服务通过直接链接(即所谓的"盗链")到存储在其他服务器上的资源(如图片、视频、音频、文档等),从而非法使用这些资源。这种机制的目的是保护资源所有者的版权和服务器资源,避免因未授权访问导致的带宽和服务器压力增加。

例如下面的三张图片

第一张是某网站图片,没有防盗链通过img标签可直接展示,第二章是某度的图片,通过img标签不显示。第三章是本地服务器图片

加了防盗链的会看不到

上面图片的html文件代码

powershell 复制代码
<html>
  <head>
        <meta charset="utf-8">
        <title>跨域问题演示</title>
        <script src="jquery.js"></script>
        <script>
            $(function(){
                $("#btn").click(function(){
                        $.get('http://192.168.101.18:80/get_user',function(data){
                                alert(JSON.stringify(data));
                        });
                });
            });
        </script>
  </head>
  <body>
        <input type="button" value="获取数据" id="btn"/>
        <img src="http://xxx.com/ab/2231/7/17837/3334/60739b32154gfrrew721476a/8742222e63cc55f.jpg"/></br> #第一张图片
        <img src="https://xxx.xxx.xxx.com/pic/cb8065380cd7912319207aecac34598as4t762"/></br> #加了防盗链的图片
        <img src="http://192.168.101.23/images/AK.jpg"/></br> #本地的图片
  </body>
</html>
~

Nginx防盗链的实现原理:

HTTP Referer头部:浏览器在请求资源时,通常会在HTTP请求中包含一个Referer头部,指明了该请求是从哪个页面发起的。服务器可以通过检查这个Referer头部来确定请求的来源是否合法。

例如百度的Refer信息

后台服务器可以根据获取到的这个Referer信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回403(服务端拒绝访问)的状态信息。

Nginx防盗链的具体实现:

valid_referers

valid_referers :nginx会通就过查看referer自动和valid_referers后面的内容进行匹配,如果匹配到了就将invalid_referer 变量置0,如果没有匹配到,则将invalid_referer变量置为1,匹配的过程中不区分大小写。

指令 valid_referers
默认值 无默认值
用途 验证HTTP请求中的Referer头部,确保请求来自信任的来源
配置示例 valid_referers none blocked server_names;

none : 不验证 Referer 头部,允许所有请求通过
blocked :在Header中的Referer不为空,但是该值被防火墙或代理进行伪装过,如不带"http://" 、"https://"等协议头的资源允许访问。
server_names :指定具体的域名或者IP
string: 可以支持正则表达式和*的字符串。如果是正则表达式,需要以~开头表示,例如

powershell 复制代码
```powershell
location ~*\.(png|jpg|gif){ #"~"表示正则表达式  "*"表示任意字符 "\" 转义 "." ,(png|jpg|gif) 表示以.png 或者 .jpg 或者 .gif结尾的都将被匹配
       valid_referers none blocked www.baidu.com 192.168.101.23 *.example.com example.*  www.example.org  ~\.google\.;
       if ($invalid_referer){
            return 403;
       }
       root /usr/local/nginx/html;

}

测试在192.168.101.18服务器上添加一张图片,在192.168.101.23 的cross.html中使用标签引用它。

在192.168.101.23 的cross.html

powershell 复制代码
<img src="http://192.168.101.18/images/AK.jpg"/></br> #本地的图片.

未添加防盗链之前是可以访问到的

在192.168.101.18的nginx添加如下代码:

powershell 复制代码
location /images {
              root html; #该目录下的所有图片都会防盗链 匹配路径:root路径+location路径: html/images
              valid_referers none blocked 192.168.101.18 www.baidu.com;
              if ($invalid_referer){
                     return 403;
             }
        }

测试:加上后23的服务器不能访问192.168.101.18服务器的图片了.

valid_referers配置解释

valid_referers none blocked 192.168.101.18 www.baidu.com;

none: 允许那些没有来源信息的请求。比如,用户直接在浏览器地址栏输入网址后访问你的资源。

blocked: 允许那些来源信息被隐藏或屏蔽的请求。有些浏览器或插件会自动隐藏来源信息,这个选项就是允许这些请求通过。通俗一点的解释是:如果你把 blocked 加到配置中,就是告诉Nginx:"如果请求的来源信息被挡住或隐藏了,也没关系,允许它通过。"

192.168.101.18: 允许那些来源是这个IP地址的请求。通常是指局域网内某台电脑或服务器发出的请求。

www.baidu.com: 允许那些来源是百度网站的请求。比如,从百度网站点击链接访问你的资源。

相关推荐
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe3 小时前
GitLab|数据迁移
运维·服务器·git
久醉不在酒3 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
虚拟网络工程师5 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant5 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker
BLEACH-heiqiyihu5 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿5 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
MXsoft6186 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库
1900436 小时前
linux6:常见命令介绍
linux·运维·服务器
Camellia-Echo6 小时前
【Linux从青铜到王者】Linux进程间通信(一)——待完善
linux·运维·服务器