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. Scala 传名参数和传值参数

    1 package com.atguigu.chapter04 2 3 object ControlAbstraction { 4 def main(args: Array[String]): Uni ...

  2. #容斥,搜索,线性筛#CF83D Numbers

    洛谷 CF83D 分析 题意就是\(\sum_{i=l}^r[k|i]*[mn[\frac{i}{k}]\geq k]\) 首先线性筛每个数的最小质因数,如果\(\frac{r}{k}\)较小直接暴力 ...

  3. 使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

    错误详情:使用IDEA直接连接数据库报错:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' ...

  4. 模拟spring工作原理

    1.配置文件 Service=service.Impl.ServiceImpl saveDao=dao.daoImpl.saveDaoImpl 2.模拟业务层 --接口 Service package ...

  5. mybatis复习(二)

    简介 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动.创建连接.创建 statement 等繁杂的 ...

  6. VMware Workstation之虚拟机NAT模式

    [摘要] 三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网. 一.虚拟机配置为NAT,实现访问互联网和宿主机 1.虚拟网络编辑器配置 VMnat8为NAT的虚拟网卡,NAT模式可以基于D ...

  7. Scrapy 基础入门

    0x01 框架概述 Scrapy 是基于 Python 的一个非常流行的网络爬虫框架,可以用来抓取 Web 站点并从页面中提取结构化的数据 (1)核心组件 引擎:用来控制整个系统的数据处理流程 调度器 ...

  8. WEB 版的报表工具有没有意义?

    这个问题得从两个方面看. 如果这个 web 版的报表工具指的是现在的自助报表,也就是 BI.多维分析,那它是有意义的, 而且各厂商们都已经做的挺好,可以让业务人员通过简单的拖拽进行各种数据分析,生成自 ...

  9. redis 简单整理——redis 的哈希基本结构和命令[三]

    前言 简单介绍一下哈希基本结构和命令. 正文 什么是hash呢? hash也可以叫做字典.关联数组. 哈希类型是键本身又是一个键值对结构: value={{field1,value1},...{fie ...

  10. 重新整理 .net core 实践篇—————应用层[三十]

    前言 简单介绍一下应用层. 正文 应用层用来做什么的呢? 应用层用来做处理api请求的. [HttpPost] public Task<long> CreateOrder([FromBod ...