Nginx — 防盗链配置

防盗链简述

防盗链是一种保护网络资源所有者权益的技术手段,旨在防止未经授权的用户或网站通过直接链接的方式盗用资源,以下是关于防盗链的简述:

原理

  • 基于请求头验证:服务器通过检查请求头中的特定字段,如Referer字段,来判断请求是否来自合法的来源。如果Referer的值表明请求是从授权的域名发起的,服务器就允许访问资源;否则,服务器可以拒绝提供资源或返回错误信息。
  • 加密与签名:对资源的链接进行加密或添加签名,使合法的请求能够正确解析和访问资源,而非法盗链的请求由于无法获取正确的加密信息或签名,无法正常访问。例如,生成包含资源路径、访问时间等信息的签名,服务器验证签名的有效性来确定请求是否合法。

常用方法

  • 设置Referer检查:服务器端配置允许访问的域名列表,只有当Referer头中的域名在列表中时,才允许访问资源。如在 Nginx 中,可通过valid_referers指令配置合法的Referer来源。
  • 使用 Token 验证:为每个合法的资源请求生成一个唯一的令牌(Token),客户端在请求资源时需要携带该令牌。服务器验证令牌的有效性,以确定是否允许访问。这种方法通常用于更严格的访问控制场景,如 API 接口的防盗链。
  • IP 限制:根据客户端的 IP 地址来限制对资源的访问。服务器可以配置允许访问的 IP 地址范围,只有来自这些 IP 地址的请求才能访问资源。但 IP 限制可能存在局限性,因为 IP 地址可能被伪造或动态分配。

作用

  • 保护资源所有者权益:防止他人未经授权使用资源,避免因盗链导致的带宽浪费、存储成本增加以及潜在的商业利益损失。例如,视频网站的视频资源若被大量盗链,会导致网站自身用户体验下降,同时影响广告收入等商业利益。
  • 维护网站性能和稳定性:减少因非法盗链带来的额外负载,确保服务器能够稳定地为合法用户提供服务。如果大量盗链请求占用了服务器带宽和资源,可能会导致网站运行缓慢甚至崩溃,影响正常用户的访问。

防盗链配置方法

防盗链的配置方法有多种,以下是一些常见服务器环境下的防盗链配置示例:

Nginx 服务器

  • 基于 Referer 验证
    • 首先在 Nginx 配置文件中,找到对应的server块或location块,添加valid_referers指令来指定合法的 Referer 来源。例如:

nginx

server {
    listen       80;
    server_name  example.com;

    location / {
        valid_referers none blocked example.com *.example.com;
        if ($invalid_referer) {
            return 403;
        }
    }
}
  • 上述配置中,valid_referers指定了允许的 Referer 来源,包括空 Referer、被截断的 Referer 以及来自example.com及其子域名的 Referer。如果Referer不合法,if条件判断会返回403 Forbidden错误。

  • 使用加密链接

    • 可以使用第三方模块如ngx_http_auth_request_module来实现加密链接防盗链。首先需要安装该模块,然后配置如下:

nginx

server {
    listen       80;
    server_name  example.com;

    location /protected_resource {
        auth_request /auth;
        # 其他配置
    }

    location /auth {
        internal;
        # 这里可以配置与认证服务器的交互逻辑,例如验证加密令牌等
        # 假设使用Lua脚本进行令牌验证
        content_by_lua_block {
            local token = ngx.var.http_token
            if token == "valid_token" then
                ngx.status = ngx.HTTP_OK
                ngx.exit(ngx.HTTP_OK)
            else
                ngx.status = ngx.HTTP_FORBIDDEN
                ngx.exit(ngx.HTTP_FORBIDDEN)
            end
        }
    }
}
  • 上述配置中,/protected_resource是需要保护的资源路径,通过auth_request指令将请求转发到/auth进行认证。在/auth location 中,使用 Lua 脚本验证请求头中携带的加密令牌token,如果令牌有效则返回200 OK,允许访问资源,否则返回403 Forbidden

Apache 服务器

  • 基于 Referer 验证
    • 在 Apache 的配置文件(通常是httpd.conf或相关的虚拟主机配置文件)中,使用mod_rewrite模块来实现基于 Referer 的防盗链。例如:

apache

<VirtualHost *:80>
    ServerName example.com

    <Directory /var/www/html>
        RewriteEngine On
        # 允许来自example.com及其子域名的Referer
        RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
        RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]
        # 对于不合法的Referer,返回403错误
        RewriteRule .* - [F]
    </Directory>
</VirtualHost>
  • 上述配置中,RewriteEngine On开启了重写引擎,RewriteCond指令设置了两个条件,第一个条件允许来自example.com及其子域名的 Referer,第二个条件排除了特定的不允许的路径。如果 Referer 不满足条件,RewriteRule会返回403 Forbidden错误。

  • 使用.htaccess 文件

    • 也可以在网站的根目录下创建.htaccess文件来配置防盗链。例如:

apache

RewriteEngine On
# 允许来自example.com及其子域名的Referer
RewriteCond %{HTTP_REFERER} ^https?://(www\.)?example\.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/forbidden [NC]
# 对于不合法的Referer,返回403错误
RewriteRule .* - [F]
  • 这种方式与在配置文件中配置类似,只是.htaccess文件可以更灵活地针对特定目录进行配置,而无需修改全局的 Apache 配置文件。

IIS 服务器

  • 基于 URL 重写模块
    • 首先需要在 IIS 服务器上安装 URL 重写模块。然后在网站的web.config文件中进行配置,例如:
  • 上述配置中,rewrite节点下的rule定义了防盗链规则。match元素匹配所有的 URL,conditions元素设置了允许的 Referer 条件,与 Apache 的配置类似。如果 Referer 不满足条件,action元素会终止请求,返回403 Forbidden错误。

这些只是基本的防盗链配置方法,实际应用中可以根据具体需求进行调整和扩展。同时,防盗链技术也在不断发展,还可以结合其他安全措施来提高资源的安全性。

一、防盗链配置通过文件进行限制(限制域名、IP)

实现思路:访问http://192.168.72.130:9999/a.html 链接,a.html中配置有http://192.168.72.130:8888/aa.webp访问aa.webp图片的访问链接,通过配置防盗链来实现房屋内控制。

步骤一:配置a.html内容

通过a.html文件里的页面跳转链接进行访问,已经配置了跨域,详见上一篇文章:Nginx — 跨域问题演示以及解决方法-CSDN博客

<html>
  <head>
        <meta charset="utf-8">
        <title>跨域问题演示</title>
        <script src="jquery.js"></script>
        <script>
            $(function(){
                $("#btn").click(function(){
                        $.get('http://192.168.72.130:8888/getUser',function(data){
                                alert(JSON.stringify(data));
                        });
                });
            });
        </script>
  </head>
  <body>
        <input type="button" value="获取数据" id="btn"/>
        <img src="http://192.168.72.130:8888/aa.webp" /><br/>
  </body>
</html>

步骤二:配置访问到a.html资源的nginx配置

server {
    listen      9999;
    server_name localhost;
    gzip on;
    root /opt/nginx;
    location / {
        index a.html;
    }
}

步骤三:配置aa.webp图片资源访问防盗链

1、将aa.webp图片上传到/opt/nginx/image目录下,按照如下配置nginx。

server {
    listen      8888;
    server_name localhost;
    gzip on;
    location ~*\.(png|jpg|gif|webp){
       valid_referers none blocked www.baidu.com;
       if ($invalid_referer){
            return 403;
       }
       root /opt/nginx/image;
       }
}

2、进行访问测试

浏览器输入:http://192.168.72.130:8888/aa.webp

能正常进行访问

步骤三:通过a.html链接跳转进行访问

浏览器输入:http://192.168.72.130:9999/

 因为配置了防盗链,所以访问失败!!

步骤四:将网段放行

1、修改nginx配置

server {
    listen      8888;
    server_name localhost;
    gzip on;
    location ~*\.(png|jpg|gif|webp){
       #配置接收来自192.168.72网段的访问
       valid_referers none blocked www.baidu.com 192.168.72.*;
       if ($invalid_referer){
            return 403;
       }
       root /opt/nginx/image;
       }
}

2、进行访问测试

浏览器输出:http://192.168.72.130:9999/ 

访问成功!! 

二、防盗链配置通过目录进行限制(限制域名、IP)

步骤一:修改nginx的配置

server {
    listen      8888;
    server_name localhost;
    gzip on;
    location /image {
       valid_referers none blocked www.baidu.com 192.168.72.*;
       if ($invalid_referer){
            return 403;
       }
       root /opt/nginx;
       }
}

浏览器输出:http://192.168.72.130:8888/image/aa.webp

访问成功!!

步骤二:修改a.html中的链接

1、修改a.html中的配置

<html>
  <head>
        <meta charset="utf-8">
        <title>跨域问题演示</title>
        <script src="jquery.js"></script>
        <script>
            $(function(){
                $("#btn").click(function(){
                        $.get('http://192.168.72.130:8888/getUser',function(data){
                                alert(JSON.stringify(data));
                        });
                });
            });
        </script>
  </head>
  <body>
        <input type="button" value="获取数据" id="btn"/>
        <img src="http://192.168.72.130:8888/image/aa.webp" /><br/>
        <a href="http://192.168.72.130:8888/image/centen.html">点击这里访问页面</a><br/>
  </body>
</html>

2、在/opt/nginx/image目录下添加centen.html文件

 步骤三:访问测试

浏览器输出:http://192.168.72.130:9999/ 

 

总结:

通过目录访问限制的方法可以将不同的资源放到对应的目录下这样可以实现对资源的控制统一控制。 

三、第三方模块ngx_http_accesskey_module 补充?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值