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: 允许那些来源是百度网站的请求。比如,从百度网站点击链接访问你的资源。

相关推荐
荣--1 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森1 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜2 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB3 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220705 天前
如何搭建本地yum源(上)
运维
ping某6 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树888 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务