我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Nginx如何防盗链

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Nginx如何防盗链

这篇文章主要介绍“Nginx如何防盗链”,在日常操作中,相信很多人在Nginx如何防盗链问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Nginx如何防盗链”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

简单有效的防盗链手段

场景

如果做过个人站点的同学,可能会遇到别人盗用自己站点资源链接的情况,这就是盗链。说到盗链就要说一个 HTTP 协议的 头部,referer 头部。当其他网站通过 URL 引用了你的页面,用户在浏览器上点击 URL 时,HTTP 请求的头部会通过 referer 头部将该网站当前页面的 URL 带上,告诉服务器本次请求是由谁发起的。

例如,在谷歌中搜索 Nginx 然后点击链接:

<img class="lazy" data-src="https://s3plus.meituan.net/v1/mss_f32142e8d47149129e9550e929704625/yzz-test-image/20200614144801.229887" />

在打开的新页面中查看请求头会发现,请求头中包含了 referer 头部且值是 https://www.google.com/ 。

<img class="lazy" data-src="https://s3plus.meituan.net/v1/mss_f32142e8d47149129e9550e929704625/yzz-test-image/20200614143843.338211" />

像谷歌这种我们是允许的,但是有一些其他的网站想要引用我们自己网站的资源时,就需要做一些管控了,不然岂不是谁都可以拿到链接。

目的

这里目的其实已经很明确了,就是要拒绝非正常的网站访问我们站点的资源。

思路

  • invalid_referer 变量

    • referer 提供了这个变量,可以用来配置哪些 referer 头部合法,也就是,你允许哪些网站引用你的资源。

referer 模块

要实现上面的目的,referer 模块可得算头一号,一起看下 referer 模块怎么用的。

  • 默认编译进 Nginx,通过 --without-http_referer_module 禁用

referer 模块有三个指令,下面看一下。

Syntax: valid_referers none | blocked | server_names | string ...; Default: &mdash; Context: server, location  Syntax: referer_hash_bucket_size size; Default: referer_hash_bucket_size 64;  Context: server, location  Syntax: referer_hash_max_size size; Default: referer_hash_max_size 2048;  Context: server, location
valid_referers referer_hash_bucket_size referer_hash_max_size

这里面最重要的是 valid_referers 指令,需要重点来说明一下。

valid_referers 指令

可以同时携带多个参数,表示多个 referer 头部都生效。

参数值
  • none

    • 允许缺失 referer 头部的请求访问

  • block:允许 referer 头部没有对应的值的请求访问。例如可能经过了反向代理或者防火墙

  • server_names:若 referer 中站点域名与 server_name 中本机域名某个匹配,则允许该请求访问

  • string:表示域名及 URL 的字符串,对域名可在前缀或者后缀中含有 * 通配符,若 referer 头部的值匹配字符串后,则允许访问

  • 正则表达式:若 referer 头部的值匹配上了正则,就允许访问

invalid_referer 变量
  • 允许访问时变量值为空

  • 不允许访问时变量值为 1

实战

下面来看一个配置文件。

server {     server_name referer.ziyang.com;     listen 80;      error_log logs/myerror.log debug;     root html;     location /{         valid_referers none blocked server_names                        *.ziyang.com www.ziyang.org.cn/nginx/                        ~\.google\.;         if ($invalid_referer) {                 return 403;         }         return 200 'valid\n';     } }

那么对于这个配置文件而言,以下哪些请求会被拒绝呢?

curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/ curl -H 'referer: ' referer.ziyang.com/ curl referer.ziyang.com/ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/

我们需要先来解析一下这个配置文件。 valid_referers 指令配置了哪些值呢?

valid_referers none blocked server_names         *.ziyang.com www.ziyang.org.cn/nginx/         ~\.google\.;
  • none:表示没有 referer 的可以访问

  • blocked:表示 referer 没有值的可以访问

  • server_names:表示本机 server_name 也就是 referer.ziyang.com 可以访问

  • *.ziyang.com:匹配上了正则的可以访问

  • www.ziyang.org.cn/nginx/:该页面发起的请求可以访问

  • ~\.google\.:google 前后都是正则匹配

下面就实际看下响应:

# 返回 403,没有匹配到任何规则 ➜  ~ curl -H 'referer: http://www.ziyang.org.cn/ttt' referer.ziyang.com/ <html> <head><title>403 Forbidden</title></head> <body> <center><h2>403 Forbidden</h2></center> <hr><center>nginx/1.17.8</center> </body> </html> ➜  ~ curl -H 'referer: http://image.baidu.com/search/detail' referer.ziyang.com/ <html> <head><title>403 Forbidden</title></head> <body> <center><h2>403 Forbidden</h2></center> <hr><center>nginx/1.17.8</center> </body> </html> # 匹配到了 *.ziyang.com ➜  ~ curl -H 'referer: http://www.ziyang.com/ttt' referer.ziyang.com/ valid ➜  ~ curl -H 'referer: http://www.ziyang.com' referer.ziyang.com/ valid # 匹配到了 server name ➜  ~ curl -H 'referer: http://referer.ziyang.com' referer.ziyang.com/ valid # 匹配到了 blocked ➜  ~ curl -H 'referer: ' referer.ziyang.com/ valid # 匹配到了 none ➜  ~ curl referer.ziyang.com/ valid # 匹配到了 ~\.google\. ➜  ~ curl -H 'referer: http://image.google.com/search/detail' referer.ziyang.com/ valid

防盗链另外一种解决方案:secure_link 模块

referer 模块是一种简单的防盗链手段,必须依赖浏览器发起请求才会有效,如果攻击者伪造 referer 头部的话,这种方式就失效了。

secure_link 模块是另外一种解决的方案。

它的主要原理是,通过验证 URL 中哈希值的方式防盗链。

基本过程是这个样子的:

  • 由服务器(可以是 Nginx,也可以是其他 Web 服务器)生成加密的安全链接 URL,返回给客户端

  • 客户端使用安全 URL 访问 Nginx,由 Nginx 的 secure_link 变量验证是否通过

原理如下:

  • 哈希算法是不可逆的

  • 客户端只能拿到执行过哈希算法的 URL

  • 仅生成 URL 的服务器,验证 URL 是否安全的 Nginx,这两者才保存原始的字符串

  • 原始字符串通常由以下部分有序组成:

    • 资源位置。如 HTTP 中指定资源的 URI,防止攻击者拿到一个安全 URI 后可以访问任意资源

    • 用户信息。如用户的 IP 地址,限制其他用户盗用 URL

    • 时间戳。使安全 URL 及时过期

    • 密钥。仅服务器端拥有,增加攻击者猜测出原始字符串的难度

模块:

  • ngx_http_secure_link_module

    • 未编译进 Nginx,需要通过 --with-http_secure_link_module 添加

  • 变量

    • secure_link

    • secure_link_expires

Syntax: secure_link expression; Default: &mdash; Context: http, server, location  Syntax: secure_link_md5 expression; Default: &mdash; Context: http, server, location  Syntax: secure_link_secret word; Default: &mdash; Context: location

变量值及带过期时间的配置示例

  • secure_link

    • 值为空字符串:验证不通过

    • 值为 0:URL 过期

    • 值为 1:验证通过

  • secure_link_expires

    • 时间戳的值

命令行生成安全链接
  • 生成 md5

echo -n '时间戳URL客户端IP密钥' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
  • 构造请求 URL

/test1.txt?md5=md5生成值&expires=时间戳(如 2147483647)
Nginx 配置
  • secure_link &dollar;arg_md5,$arg_expires;

    • secure_link 后面必须跟两个值,一个是参数中的 md5,一个是时间戳

  • secure_link_md5 \"&amp;dollar;secure_link_expires&dollar;uri&dollar;remote_addr secret";

    • 按照什么样的顺序构造原始字符串

实战

下面是一个实际的配置文件,我这里就不做演示了,感兴趣的可以自己做下实验。

server {     server_name securelink.ziyang.com;     listen 80;     error_log  logs/myerror.log  info;     default_type text/plain;     location /{         secure_link $arg_md5,$arg_expires;         secure_link_md5 "$secure_link_expires$uri$remote_addr secret";          if ($secure_link = "") {             return 403;         }          if ($secure_link = "0") {             return 410;         }          return 200 '$secure_link:$secure_link_expires\n';     }      location /p/ {         secure_link_secret mysecret2;          if ($secure_link = "") {             return 403;         }          rewrite ^ /secure/$secure_link;     }      location /secure/ {         alias html/;         internal;     } }

仅对 URI 进行哈希的简单办法

除了上面这种相对复杂的方式防盗链,还有一种相对简单的防盗链方式,就是只对 URI 进行哈希,这样当 URI 传

secure_link_secret secret;
命令行生成安全链接
  • 原请求

    • link

  • 生成的安全请求

    • /prefix/md5/link

  • 生成 md5

    • echo -n 'linksecret' | openssl md5 &ndash;hex

Nginx 配置
  • secure_link_secret secret;

这个防盗链的方法比较简单,那么具体是怎么用呢?大家都在网上下载过资源对吧,不管是电子书还是软件,很多网站你点击下载的时候往往会弹出另外一个页面去下载,这个新的页面其实就是请求的 Nginx 生成的安全 URL。如果这个 URL 被拿到的话,其实还是可以用的,所以需要经常的更新密钥来确保 URL 不会被盗用。

到此,关于“Nginx如何防盗链”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Nginx如何防盗链

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Nginx如何防盗链

这篇文章主要介绍“Nginx如何防盗链”,在日常操作中,相信很多人在Nginx如何防盗链问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Nginx如何防盗链”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!简单
2023-06-17

Nginx怎么配置防盗链

这篇文章给大家分享的是有关Nginx怎么配置防盗链的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、单刀直入,先上nginx配置文件server { listen 80;
2023-06-16

nginx中怎么利用referer指令配置防盗链

今天就跟大家聊聊有关nginx中怎么利用referer指令配置防盗链,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现图片防盗链:1location ~* \.(gif|jpg|pn
2023-06-05

Linux中Nginx的防盗链和优化的实现代码

隐藏版本号 未隐藏版本号,为了提高安全性,需要对版本号进行隐藏。隐藏版本号实验cd /usr/local/nginx/ ### 编辑配置文件 vim conf/nginx.conf修改用户组 主进程使用root,子进程则通过nginx用户v
2022-06-03

如何解决java项目中的防盗链

本篇文章给大家分享的是有关如何解决java项目中的防盗链,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.防盗链的概念内容不在自己的服务器上,通过技术手段将其他网站的内容(比如
2023-05-31

Nginx防盗链与服务优化配置的示例分析

这篇文章给大家分享的是有关Nginx防盗链与服务优化配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。隐藏nginx版本号查看版本号方法一:curl命令可以在 CentOS 中使用命令 curl -I
2023-06-26

如何设置WordPress图片防盗链方法 推荐

如果http://www.cppcns.com您的博客有很多很多图片,空间又有流量限制,那么防止别人盗取自己的图片链接应该说是势在必行了,因为在国内,博客内容互相复制的现象相当的普遍,大家都非常珍惜自己的那一点点空间,直接复制图片(复制是带
2022-06-12

apache中怎么设置Rewrite防盗链

本篇文章为大家展示了apache中怎么设置Rewrite防盗链,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。设置 .htaccess 禁止图片盗链 RewriteEngine on 打开重写url
2023-06-10

WordPress 防盗链设置方法分享

询问结果却有些出乎意料,竟然是超流量了,使用这么久还是第一次遇到超量的情况。 登陆cPanel后台查看也确实看到有几个站在盗链图片,而且使用的流量还不少。这样下去还了得,白用图片不说,还要每月给你们支付超标的流量费。于是第一时间做了防盗链设
2022-06-12

node.js突破nginx防盗链机制,下载图片案例分析 原创

这篇文章主要介绍了node.js突破nginx防盗链机制,下载图片的方法,结合具体案例形式分析了防盗链的相关原理与node.js使用axios库下载防盗链图片的相关操作技巧,需要的朋友可以参考下
2023-10-18

如何利用apache防盗连

这篇文章主要讲解了“如何利用apache防盗连”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用apache防盗连”吧!防盗链原理:  http标准协议中有专门的字段记录referer 
2023-06-10

基于PHP实现图片防盗链

基于PHP的图片防盗链方法可以防止他人未经授权引用网站图片,确保网站版权。有两种常见方法:HTTP头部验证和CSRFToken验证。HTTP头部验证通过检查请求头部来验证合法性,但易被绕过。CSRFToken验证安全性更高,但实现较复杂。选择合适的防盗链方法取决于网站需求和安全级别。
基于PHP实现图片防盗链
2024-04-02

基于PHP做个图片防盗链

本文主要介绍了Referer原理与图片防盗链实现方法,结合实例形式分析了Referer头信息原理与图片防盗链判定、实现方法,并附带一个Http请求封装类,需要的朋友可以参考下
2022-12-20

如何防止域名被盗

这篇文章主要介绍“如何防止域名被盗”,在日常操作中,相信很多人在如何防止域名被盗问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何防止域名被盗”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 域名是网站一个
2023-06-06

Apache的防盗链的技术怎么实现

这篇文章主要介绍“Apache的防盗链的技术怎么实现”,在日常操作中,相信很多人在Apache的防盗链的技术怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Apache的防盗链的技术怎么实现”的疑惑有所
2023-06-05

dedecms 软件下载频道防盗链php代码

dede做软件站有的缺点 就是别人转帖你的下载的时候直接转帖http://www.xxx.com/plus/download.php......... 就是直接打开下载地址列表页这种就可以下载了,耗费资源却又带不了用户。 经过研究,终于搞定
2022-06-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录