1 nginx防盗链功能

1.1 盗链功能概述

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链。

防盗链由nginx的ngx_http_referer_module模块提供,使用的主要语法为valid_referers,具体说明如下:

  • valid_referers none|blocked|server_names|string ...;

    用于定义referer首部的合法可用值,不能匹配的将是非法值。

    支持环境:server, location

    参数说明

    • none:请求报文首部没有referer首部,一般为本地资源,比如浏览器直接输入域名访问就没有referer信息,需要设定为有效。

    • blocked:请求报文有referer首部,但没有有效值,比如为空。

    • server_names:referer首部中包含本主机名,即nginx监听的server_name。

    • arbitrary_string:任意字符串,但可使用*作通配符

    • regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如~.*\.xuzhichao\.com

  • $invalid_referer:nginx变量,表示无效的首部

referer字段示例:

使用搜狗直接搜索web网站然后点击访问就会生成referer信息:

在服务器上产生的日志如下,产生了referer信息。

{ "@timestamp": "2021-06-22T23:27:05+08:00", "remote_addr": "192.168.20.1", "referer": "https://www.sogou.com/sogou?prs=5&rfg=1&query=www.xuzhichao.com&pid=AQktG&ie=utf8", "request": "GET / HTTP/1.1", "status": 200, "bytes":27, "agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }

1.2 实现盗链

场景:www.nginx01.com网站盗取www.xuzhichao.com站点的一张图片。

www.xuzhichao.com站点的配置文件和图片页面如下:

#www.xuzhichao.com站点的配置文件:
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html;
}
} #站点的main.html页面内容如下:
[root@nginx01 xuzhichao]# cat main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>www.xuzhichao.com</title>
<style type="text/css">
/*清除所有标签的默认样式*/
*{
padding: 0;
margin: 0;
}
.box1{
width: 1215px;
height: 700px;
background-image: url(css/earth.jpg);
}
p{
color: red;
font-size: 32px;
font-weight: bold;
font-family: "arial","华文彩云","微软雅黑",serif;
}
</style>
</head>
<body>
<p>这是"www.xuzhichao.com"的首页</p>
<div class="box1"></div></body>
</body>
</html> #图片文件如下:
[root@nginx01 xuzhichao]# ll css/earth.jpg
-rw-r--r-- 1 root root 101389 Jun 22 23:07 css/earth.jpg

用户访问该页面效果如下:

www.nginx01.com的配置文件和模拟盗链页面如下:

server {
listen 80;
server_name www.nginx01.com;
charset utf-8,gbk; access_log /var/log/nginx/access_nginx01.log access_json; location / {
root /data/nginx/html/web1;
index index.html;
}
} #盗链页面
[root@nginx01 web1]# cat daolian.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>盗链页面</title>
</head> <body>
<a href="http://www.xuzhichao.com">盗链</a>
<img src="http://www.xuzhichao.com/css/earth.jpg">
</body>
</html>

客户端访问效果如下:

查看日志信息:

#www.nginx01.com站点的访问记录,请求/daolian.html页面,但是图片却是www.xuzhichao.com站点的
[root@nginx01 web1]# tail /var/log/nginx/access_nginx01.log
{ "@timestamp": "2021-06-22T23:52:41+08:00", "remote_addr": "192.168.20.1", "referer": "-", "request": "GET /daolian.html HTTP/1.1", "status": 200, "bytes":224, "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" } #www.xuzhichao.com站点的访问日志,referer字段显示了盗链地址,浪费了自己站点的流量为其他站点提供了服务。
[root@nginx01 web1]# tail /var/log/nginx/access_xuzhichao.log
{ "@timestamp": "2021-06-22T23:52:41+08:00", "remote_addr": "192.168.20.1", "referer": "http://www.nginx01.com/", "request": "GET /css/earth.jpg HTTP/1.1", "status": 200, "bytes":101389, "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", "x_forwarded": "-", "upstr_addr": "-","upstr_host": "-","upstreamtime": "-" }

1.3 实现防盗链

在www.xuzhichao.com站点上实现防盗链功能。

#www.xuzhichao.com站点的配置文件如下:
[root@nginx01 ~]# cat /etc/nginx/conf.d/xuzhichao.conf
server {
listen 80;
server_name www.xuzhichao.com;
access_log /var/log/nginx/access_xuzhichao.log access_json; location / {
root /data/nginx/html/xuzhichao;
index index.html; #定义合法的referer信息,允许*.b.com b.*以及百度,谷歌跳转;
valid_referers none blocked server_names *.b.com b.* ~\.baidu\. ~\.google\.; #对于不合法的referer信息返回403;
if ( $invalid_referer ) {
return 403;
}
}
} #重启nginx服务
[root@nginx01 ~]# systemctl reload nginx.service

客户端测试:

发现盗链的图片无法显示,返回403错误。

WEB服务与NGINX(19)- nginx 防盗链功能的更多相关文章

  1. Nginx实践篇(2)- Nginx作为静态资源web服务 - 控制浏览器缓存、防盗链

    一.控制浏览器缓存 1. 浏览器缓存简介 浏览器缓存遵循HTTP协议定义的缓存机制(如:Expires;Cache-control等). 当浏览器无缓存时,请求响应流程 当浏览器有缓存时,请求响应流程 ...

  2. 16.Nginx优化与防盗链

    Nginx优化与防盗链 目录 Nginx优化与防盗链 隐藏版本号 修改用户与组 缓存时间 日志切割 小知识 连接超时 更改进程数 配置网页压缩 配置防盗链 配置防盗链 隐藏版本号 可以使用 Fiddl ...

  3. nginx secure_link下载防盗链

    下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷.flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效 ...

  4. nginx如何设置防盗链

    关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链! 一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通 ...

  5. nginx服务器图片防盗链的方法

    nginx服务器图片防盗链的方法<pre> location ~* \.(gif|jpg|png|jpeg)$ { expires 30d; valid_referers *.shuche ...

  6. 【转】nginx如何设置防盗链

    转自博客园作者:howhy,文章地址:nginx如何设置防盗链.大佬写的甚好,在此备份一下 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底 ...

  7. 实现fastdfs防盗链功能

    目录 1.背景 2.实现原理 2.1 开启防盗链 2.2 重启 nginx 2.3 Java代码生成token 1.token生成规则 2.java生成token 3.测试 3.1 带正确token访 ...

  8. ASP.net UrlRewrite的防盗链功能

    ASP.net中如何实现基于UrlRewrite的防盗链. ASP.net中最快实现UrlRewrite的方法这篇文章中说了如何做UrlRewrite,那只是一个最简单的应用 其实利用UrlRewri ...

  9. Nginx优化与防盗链

    目录: 一.隐藏版本号 二.修改用户与组 三.缓存时间 四.日志切割 五.连接超时 六.更改进程数 七.配置网页压缩 一.隐藏版本号 可以使用 Fiddler 工具抓取数据包,查看 Nginx版本 也 ...

  10. Nginx图片的防盗链配置

    [root@web01 www]# cat /app/server/nginx/conf/vhosts/default.conf server { listen default_server; ser ...

随机推荐

  1. python 处理国家标准行业编码(编码·门类·大类·中类·小类)

    进度 今天完整地进行了行业维度的清洗分析,把行业代码根据国家标准清洗出格式为  "编码·门类·大类·中类·小类"  的数据格式 过程 1.先把国家标准编码转化为json数据 2.根 ...

  2. SqlServer的实用且高级玩法.md

    1.常见表表达式(CTEs) 如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表. 使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落 ...

  3. #裴蜀定理#洛谷 2520 [HAOI2011]向量

    题目 分析 首先若 \(a,b\) 都为 0 要特判. 若 \(\begin{cases}x=pa+qb+p'a+q'b\\y=qa+pb-q'a-p'b\end{cases}\) 合并同类项可以得到 ...

  4. #高斯消元,概率期望,动态规划#洛谷 3211 [HNOI2011]XOR和路径

    题目 分析 由于不同二进制位互不影响,所以考虑按位处理 设\(dp[i]\)表示第\(i\)个点某一位为1的概率,那么 \[dp[i]=\frac{1}{deg[i]}(\sum_{(i,u)=0}d ...

  5. #Dijkstra,二进制拆位#洛谷 5304 [GXOI/GZOI2019]旅行者

    题目 分析(\(logk\)次Dijkstra) 首先为什么\(O(nklogn)\)的多次\(dijkstra\)为什么会TLE, 因为中间有许多的冗余状态,即使两点求出的路径是最短的,它也不一定是 ...

  6. OpenHarmony父子组件单项同步使用:@Prop装饰器

      @Prop装饰的变量可以和父组件建立单向的同步关系.@Prop装饰的变量是可变的,但是变化不会同步回其父组件. 说明: 从API version 9开始,该装饰器支持在ArkTS卡片中使用. 概述 ...

  7. 深度解析 Spring Security:身份验证、授权、OAuth2 和 JWT 身份验证的完整指南

    Spring 安全框架 Spring Security 是一个用于保护基于 Java 的应用程序的框架.它是一个功能强大且高度可定制的身份验证和访问控制框架,可以轻松地集成到各种应用程序中,包括 We ...

  8. DevEco Studio新特性分享-跨语言调试,让调试更便捷高效

     原文:https://mp.weixin.qq.com/s/JKVLQXu1z1zAoF5q49YEGg,点击链接查看更多技术内容.   HUAWEI DevEco Studio是开发Harmony ...

  9. 深入解析decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在"="的 ...

  10. 给蚂蚁金服 antv 提个 PR, 以为是改个错别字, 未曾想背后的原因竟如此复杂!

    前言 什么? 你不了解G2Plot? 没关系, 今天咱们要分享的内容和G2Plot的关系, 就像雷锋和雷峰塔的关系. 因此, 不必担心听不懂. 我一直觉得, 如果我写的文章有人看不懂, 那一定是我写的 ...