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. 【转载】Vue路由 hash与history 的区别

    [转载]Vue路由 hash与history 的区别 两种路由模式原因 对于 Vue 这类渐进式前端开发框架, 为了构建 SPA(单页面应用), 需要引入前端路由系统, 这也就是 Vue-Router ...

  2. C++ 互斥

    mutex mutex 类是能用于保护共享数据免受从多个线程同时访问的同步原语. mutex 提供排他性非递归所有权语义: 调用方线程从它成功调用 lock 或 try_lock 开始,到它调用 un ...

  3. WPF中封装一个自己的MessageBox

    前言 在WPF应用程序开发中,我们可以借助其强大灵活的设计能力打造出绚丽而富有创意的用户界面.然而,与这种高度定制化的界面相比,标准MessageBox却显得有些原始和古老.它的外观与现代.绚丽的应用 ...

  4. DevSecOps 中的漏洞管理(上)

    DevSecOps意味着在DevOps交付管道把安全性包含进去.该模型尽可能早地将安全原则集成到软件开发生命周期的所有适用阶段中.下图展示了安全方面在DevOps后期阶段的集成,但DevSecOps安 ...

  5. #RMQ,动态开点线段树#CF803G Periodic RMQ Problem

    题目 给定\(n\)个数,将这个数列复制\(k\)次得到数列\(a\), 对\(a\)满足区间赋值操作和区间最小值询问 \(n\leq 10^5,q\leq 10^5,k\leq 10^4即|a|\l ...

  6. Go 语言 Printf 函数和格式化动词详解

    Printf() 函数可以使用多种格式化动词对输出进行格式化.下面是可以与所有数据类型一起使用的一些通用格式化动词: 以下动词适用于所有数据类型: 动词 描述 %v 以默认格式打印值 %#v 以 Go ...

  7. openGauss 列存表PSort索引

    openGauss 列存表 PSort 索引 概述 PSort(Partial sort) Index 是在列存表的列上建的聚簇索引.CUDesc 上有每个 CU 的 min 和 max 值,但如果业 ...

  8. ArkUI,更高效的框架设计

     原文:https://mp.weixin.qq.com/s/uSIzuBby7Z92drNDmejKXw,点击链接查看更多技术内容.     上期文章我们讲到了ArkUI的三大特性,同时提到了Ark ...

  9. Code Aesthetic

    01 Abstraction Abstraction is the process of aggregating code with high similarity among multiple cl ...

  10. CENTOS 6.4 编译安装APACHE PHP MYSQL ZEND【转载未测试】

    CENTOS 6.4 编译安装APACHE PHP MYSQL ZEND 由 cache 发布于 WWW 2013-07-21 [ 5560 ] 次浏览 [ 0 ] 条评论 标签: LAMP 搞网站跑 ...