WEB服务与NGINX(19)- nginx 防盗链功能
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 防盗链功能的更多相关文章
- Nginx实践篇(2)- Nginx作为静态资源web服务 - 控制浏览器缓存、防盗链
一.控制浏览器缓存 1. 浏览器缓存简介 浏览器缓存遵循HTTP协议定义的缓存机制(如:Expires;Cache-control等). 当浏览器无缓存时,请求响应流程 当浏览器有缓存时,请求响应流程 ...
- 16.Nginx优化与防盗链
Nginx优化与防盗链 目录 Nginx优化与防盗链 隐藏版本号 修改用户与组 缓存时间 日志切割 小知识 连接超时 更改进程数 配置网页压缩 配置防盗链 配置防盗链 隐藏版本号 可以使用 Fiddl ...
- nginx secure_link下载防盗链
下载服务器上有众多的软件资源, 可是很多来源不是本站,是迅雷.flashget, 源源不断的带宽,防盗链绝对是当务之急. 使用来源判断根本不靠谱,只能防止一些小白站点的盗链,迅雷之类的下载工具完全无效 ...
- nginx如何设置防盗链
关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链! 一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通 ...
- nginx服务器图片防盗链的方法
nginx服务器图片防盗链的方法<pre> location ~* \.(gif|jpg|png|jpeg)$ { expires 30d; valid_referers *.shuche ...
- 【转】nginx如何设置防盗链
转自博客园作者:howhy,文章地址:nginx如何设置防盗链.大佬写的甚好,在此备份一下 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底 ...
- 实现fastdfs防盗链功能
目录 1.背景 2.实现原理 2.1 开启防盗链 2.2 重启 nginx 2.3 Java代码生成token 1.token生成规则 2.java生成token 3.测试 3.1 带正确token访 ...
- ASP.net UrlRewrite的防盗链功能
ASP.net中如何实现基于UrlRewrite的防盗链. ASP.net中最快实现UrlRewrite的方法这篇文章中说了如何做UrlRewrite,那只是一个最简单的应用 其实利用UrlRewri ...
- Nginx优化与防盗链
目录: 一.隐藏版本号 二.修改用户与组 三.缓存时间 四.日志切割 五.连接超时 六.更改进程数 七.配置网页压缩 一.隐藏版本号 可以使用 Fiddler 工具抓取数据包,查看 Nginx版本 也 ...
- Nginx图片的防盗链配置
[root@web01 www]# cat /app/server/nginx/conf/vhosts/default.conf server { listen default_server; ser ...
随机推荐
- Python爬取国家统计局2009至2020统计用区划和城乡划分代码(省市区/县三级)并存入mysql数据库
国家统计局->统计标准网址:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/ 获取资源请关注公众号 [靠谱杨阅读人生]回复[城乡分类]获取 流程 ...
- HTML实现发送接收串口和TCP数据
前提 请安装通讯调试工具,所有的网页必须运行在本工具上,在其他浏览器直接打开是不行的. 效果显示 在网页上右键打开,选择其他应用 2.在其他应用中找到通讯调试工具 如果没有这一项,点更多,在计算机中查 ...
- NUMA 平台
What is NUMA? This question can be answered from a couple of perspectives: the hardware view and the ...
- Mac 使用 Nginx 在本地部署静态网站
安装 安装 Brew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/i ...
- 掌握 C++ 中 static 关键字的多种使用场景
static是什么 在最开始C中引入了static关键字可以用于修饰变量和函数,后来由于C++引入了class的概念,现在static可以修饰的对象分为以下5种: 成员变量,成员函数,普通函数,局部变 ...
- springboot整合redis之发送手机验证码
阿里云服务发送手机短信验证码-----(第二篇) 文章概述:springboot整合redis之发送手机验证码注册登录 注:搭建springboot项目可以参考这篇文章: 前言:短信验证码是通过发送验 ...
- 应用缺少POI数据,如何开发地点深度信息?
用户在App里搜索某个地点时,并不满足单一的地点信息,希望得到更多可以帮助其做决策的深度信息.例如有打车出行需求的用户,在打车App里搜索地点时可以显示周边的地点,精确到某个路口,让用户可以自由选择合 ...
- Django集成layui 的 layedit 之图片上传接口
# a.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all files for configuration ':classpath'.
前言 这个错误怎么看呢? 如果你对gradle 不是很了解的话,有一个建议,就是把异常背下来,当然是看这个:ArtifactResolveException哈. 而不是后面的详情. 正文 给我们详情是 ...
- mmcls 多标签模型部署在torch serve
GitHub仓库:gy-7/mmcls_multi_label_torchserve (github.com) 各个文件说明: cls_requests_demo:分类模型请求api服务的demo d ...