文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

Nginx如何防盗链

2023-06-17 05:09

关注

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

简单有效的防盗链手段

场景

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

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

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

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

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

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

目的

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

思路

referer 模块

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

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 头部都生效。

参数值
invalid_referer 变量

实战

下面来看一个配置文件。

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\.;

下面就实际看下响应:

# 返回 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 中哈希值的方式防盗链。

基本过程是这个样子的:

原理如下:

模块:

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

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

命令行生成安全链接
echo -n '时间戳URL客户端IP密钥' | openssl md5 -binary | openssl base64 | tr +/ - | tr -d =
/test1.txt?md5=md5生成值&expires=时间戳(如 2147483647)
Nginx 配置

实战

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

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;
命令行生成安全链接
Nginx 配置

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

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯