专栏首页运维录如何为Nginx 配置防盗链功能?

如何为Nginx 配置防盗链功能?

开始之前
什么是 referer 请求头?

referer 请求头包含了当前请求页面的来源地址,即表示当前页面是通过这个来源页面里的链接进入的。

服务端一般使用referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

利用 referer 防止盗链?

假设当一个 HTTP 请求头的 referer 字段中包含一些不正确(期望)的值

那么可以使用 nginx 的 ngx_http_referer_module 模块,禁止这个请求访问站点

也就是常说的 nginx 防盗链,不过需要注意的是,referer 请求头是可以伪造的,因此这个模块并不能 100%的阻止这类请求。

防盗链功能主要由模块中的 valid_referers 指令与 $invalid_referer 变量配合使用,例如下面的配置,允许符合以下规则的请求访问站点

  • 没有 referer,直接在浏览器打开这个URI。
  • 带有 referer,但是被修改过值(如proxy)不是以http(s)://开头的字符串。
  • 带有 referer, 值是以http(s)://开头的字符串,并且匹配 valid_referers列表中的值。

操作步骤


1. nginx 配置文件

cat /etc/nginx/conf.d/default.conf

server {

   #..其它配置项目省略
    
   # 上传图片目录
    location ^~ /attachments {
        alias /data/uploads/;
        expires 180d;
        
       valid_referers none blocked 
                                       *.demo.com demo.com
                                       ~\.demo\.;
       if ($invalid_referer) {
            return 403;
        }
    }
}

2. 重启 nginx

nginx -t && nginx reload

3. 验证

4次请求,前3次为200,最后一次403 。

请求1,没有带`referer`信息,相当于直接在浏览器打开这个URI,匹配参数 "None"。

请求2,虽然有带`referer`信息,但值不是以"http(s)://"开头的字符串,匹配参数 "blocked"。

请求3,带有正确主机名`referer`信息,匹配参数 "server_names",这也是浏览器中正常请求。

请求4,带有域外的主机名`referer`信息,"表示这个请求是从百度页面里的链接进入的",按照规则                     $invalid_referer 变量被设置为 1 ,最终服务器返回 403状态码,完成防盗链。

valid_referers 指令

语法: valid_referers none|blocked|server_names string ...;
默认值: no
使用字段: server, location
功能: 此指令在 referer头的基础上为 $invalid_referer 变量赋值,可以实现简单的防盗链功能。 
如果 valid_referers列表中没有匹配Referer请求头,$invalid_referer将被设置为1,否则为0(或空值)。
参数:
none
    请求头中不存在 Referer字段('空值',比如直接在浏览器打开一个图片URI)。
blocked
    请求头中存在 Referer字段,但值不是以"http(s)://"开头的字符串(被防火墙或代理服务器修改删除)。
server_names
     Referer字段包含服务器名称。
arbitrary string
    定义服务器名称和可选 URI前缀,服务器名称的开头或结尾可以有一个"*"。
regular expression
    使用正则匹配,第一个符号为"~"。
示例:
    valid_referers none blocked server_names
                   *.example.com example.* www.example.org/galleries/
                   ~\.google\.;

    if ($invalid_referer) {
        return 403;
    }

参考

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referer

http://nginx.org/en/docs/http/ngx_http_referer_module.html

小结


最后来总结下文章中的知识点

  • referer 请求头,用于识别访问来源。
  • referer 请求头可以伪造,不能做为唯一的判断条件。
  • 借助 ngx_http_referer_module 模块,实现简单的 nginx 防盗链。

本文分享自微信公众号 - 运维录(gh_70d95b8f5f7c),作者:东南

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx 缓存服务器(下)

    上一节讲解了在那些场景下使用 Nginx Cache服务器,以及如何配置、调试 Nginx Cache功能,需要的可以看这里,这一节讲一讲 Nginx Cach...

    用户1560186
  • ​创建一个Docker 容器

    之前公众号发布了三篇关于Docker镜像与仓库的文章,如果需要阅读可以在微信公众号后台回复 镜像 获得文章链接,接下来让我们创建第一个容器。

    用户1560186
  • Nginx 缓存服务器(番外)定制Docker镜像

    在 "nginx 缓存服务器(下)" 这篇文章中,我们讲解了如何使用 ngx_cache_purge模块主动清理缓存,不过默认的 nginx镜像是不包含 ngx...

    用户1560186
  • Image Captioning with RNNs

    0.导语1.下载数据集2.Look at the data3.Vanilla RNN3.1 step forward3.2 step backward3.3 f...

    公众号guangcity
  • 深度学习碰上古文献,西南大学提出基于CNN的古彝文识别方法

    摘要:作为世界六大古文字之一的古彝文记录下几千年来人类发展历史。针对古彝文的识别能够将这些珍贵文献材料转换为电子文档,便于保存和传播。由于历史发展,区域限制等多...

    机器之心
  • OCR大突破:Facebook推出大规模图像文字检测识别系统——Rosetta

    作者 | Fedor Borisyuk,Albert Gordo,Viswanath Sivakumar

    AI科技大本营
  • 自然场景文本检测识别技术综述

    番外 青蛇: 姐, 图像文本检测和识别领域现在的研究热点是什么? 白蛇: 白纸黑字的扫描文档识别技术已经很成熟,而自然场景图像文本识别的效果还不理想。倾斜字、艺...

    SIGAI学习与实践平台
  • Android OpenGL ES(二)-正交投影

    平移矩阵和单位矩阵和类似。但是向量[x,y,z,1]前乘这个平移矩阵后的结构就是平移矩阵中定义的偏移量。

    deep_sadness
  • Windows下Cygwin可以使用哪些Linux命令

    Windows下Cygwin可以使用哪些Linux命令 目录 我们先来看下Cygwin安装后的目录结构,如图所示: ? 注:笔者的Cygwin安装在C盘根目录下...

    苦叶子
  • 腾讯数平团队 荣获第15届国际文档分析与识别竞赛七项冠军

    ? 导语:在刚刚结束的第15届国际文档分析与识别大会(澳大利亚悉尼)上,腾讯数据平台部(下称“数平”)团队获颁7项冠军证书,并受邀在会议上做技术分享。 9.2...

    腾讯技术工程官方号

扫码关注云+社区

领取腾讯云代金券