Nginx 防盗链
nginx防盗链问题
盗链:
就是a网站有一张照片,b网站引用了a网站的照片 。
防盗链:
a网站通过设置禁止b网站引用a网站的照片。
nginx防止网站资源被盗用模块
ngx_http_referer_module
如何区分哪些是不正常的用户?
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.
比如在www.google.com 里有一个
www.baidu.com
链接,那么点击这个www.baidu.com
,它的header
信息里就有:Referer=http://www.google.com
防盗链配置要点
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
# 日志格式添加"$http_referer"
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
# valid_referers 使用方式
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
盗链实验:
准备俩台服务器,a服务器用做网站正版发布照片,b服务器用作引用a服务器的图片信息的服务器。
a服务器IP:192.168.231.171
b服务器IP:192.168.231.173
在a服务器的配置文件内
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;index 1.jpg;
}
}更改完配置文件 记得重启
[root@localhost ~]# nginx -s reload#网站默认发布页面的路径
[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# ls
1.jpg 50x.html index.html
正常访问a网站
b服务器,配置nginx访问页面
由于b服务器也是yum安装的nginx
因此b服务器的nginx默认发布页面路径在 /usr/local/nginx/html/下
[root@daili ~]# cd /usr/share/nginx/html/
[root@daili html]# ls
50x.html index.htmlvim index.html<html>
<head><meta charset="utf-8"> #用老做实验 红色的底<title>qf.com</title>
</head>
<body style="background-color:red;"><img src="http://192.168.231.171/1.jpg"/> #盗用171IP的1.jpg这个图片
</body>
</html>
此时访问b网站,由于它盗用了a网站的图片,因此
观察a服务器的日志
这就做成了盗链实验
防盗链实验
实验机器
a服务器IP:192.168.231.174 真正提供照片的服务器
b服务器IP:192.168.231.173
1.防盗链的操作得在真正发布这张图片的服务器修改配置文件
a服务器#vim /etc/nginx/conf.d/default.conf server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;index 1.jpg;
valid_referers server_names 192.168.231.173;
#server_names 只允许指定ip域名来访问资源if ($invalid_referer) {return 502; #其他ip或者域名来访问a服务器,返回502
}}
}重启服务
nginx -s reload
这样就相当于将173这个ip添加到白名单中,只有192.168.231.173可以访问a服务器的资源。
通过百度来访问a服务器
[root@daili ~]# curl -e "www.baidu.com" -Ik 192.168.231.173
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 11:29:07 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive#由于在a服务器的配置文件设置只能IP为192.168.231.173的来访问,因此其他ip来访问返回502
平时我们都是通过本机电脑的ip来访问b服务器,而curl -e "ip/域名" -Ik 要访问的ip
这条命令是我们通过此ip来访问另一个ip。
curl -e "www.baidu.com" -Ik 192.168.231.173
我们通过百度来访问173IP,相当于我们此时的电脑本机变成了百度。
相同的是,我们设置为只有百度可以访问a服务器,那么b服务器上的图片就会失真打不开
a服务器
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;index 1.jpg;
valid_referers server_names www.baidu.com;
if ($invalid_referer) {return 502;
}
}
}重启服务
nginx -s reload
访问b服务器的网站
三个要素:
none : 允许没有http_refer的请求访问资源;
blocked : 允许不是http://开头的,不带协议的请求访问资源;
server_names : 只允许指定ip/域名来的请求访问资源(白名单);
加none
真正有图片的a服务器
server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;valid_referers none 192.168.231.173;index 1.jpg;
}
}
浏览查看a服务器的发布页面
查看日志
tailf /var/log/nginx/access.log
通过百度来访问a服务器
[root@localhost ~]# curl -e "www.baidu,com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:07:27 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes
不加none
a服务器的配置文件
/etc/nginx/conf.d/default.confserver {listen 80;server_name localhost;location /{root /usr/share/nginx/html;
index 1.jpg;valid_referers blocked www.jd.com;
if ($invalid_referer) {return 502;}
}
}
访问a服务器的网站
因此
none只是决定能不能访问a服务器本身,加none可以访问a服务器本身,不加none不可以访问a服务器本身。
blocked
本身含义是允许开头不带http的访问成功,那就意味着 带http的访问不成功
配置a服务器的配置文件
server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;
index 1.jpg;valid_referers blocked 192.168.231.174;
if ($invalid_referer) {return 502;}
}
}
访问www与http://www 后者就不可以访问
[root@daili ~]# curl -e "http://www.jd.com" -Ik 192.168.231.171
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 13:02:34 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive[root@daili ~]# curl -e "www.jd.com" -Ik 192.168.231.171
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Mon, 23 Oct 2023 13:02:37 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes
情况2 加*.jd.com
server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;valid_referers none blocked *.jd.com ;index 1.jpg;
}
}
[root@daili ~]# curl -e "http://www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:31:52 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes[root@daili ~]# curl -e "www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:32:00 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes
这里虽然配置文件里面写了blocked,但是白名单里面定义的是*.jd.com,因此他有俩个 一个是www开头,一个是http:// 因此访问http://jd.com 可以访问
server {listen 80;server_name localhost;location /{root /usr/share/nginx/html;valid_referers none blocked www.jd.com ;index 1.jpg;
}
}
[root@daili ~]# curl -e "www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:35:17 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes[root@daili ~]# curl -e "http://www.jd.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:35:19 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes
这里尽管定义配置的是www.jd.com 按道理输入http://jd.com 是访问不了的,但是在配置文件里面location是在server下的,而server是在http下面的,因此输入http://jd.com 也是可以访问的。
相同那么加了blocked 由于 白名单里面没有baidu.com 因此 访问www.baidu.com可以访问,访问http://www.baidu.com 就不可以访问。
[root@localhost conf.d]# curl -e "www.baidu.com" -Ik 192.168.231.174
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:57:27 GMT
Content-Type: image/jpeg
Content-Length: 647023
Last-Modified: Fri, 15 Sep 2023 06:06:10 GMT
Connection: keep-alive
ETag: "6503f452-9df6f"
Accept-Ranges: bytes[root@localhost conf.d]# curl -e "http://www.baidu.com" -Ik 192.168.231.174
HTTP/1.1 502 Bad Gateway
Server: nginx/1.24.0
Date: Tue, 24 Oct 2023 13:57:32 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive
相关文章:

Nginx 防盗链
nginx防盗链问题 盗链: 就是a网站有一张照片,b网站引用了a网站的照片 。 防盗链: a网站通过设置禁止b网站引用a网站的照片。 nginx防止网站资源被盗用模块 ngx_http_referer_module 如何区分哪些是不正常的用户? HTTP Referer…...

26. 通过 cilium pwru了解网络包的来龙去脉
pwru是一种基于eBPF的工具,可跟踪Linux内核中的网络数据包,并具有先进的过滤功能。它允许对内核状态进行细粒度检查,以便通过调试网络连接问题来解决传统工具(如iptables TRACE或tcpdump)难以解决甚至无法解决的问题。在本文中,我将介绍pwru如何在不必事先了解所有内容的…...
刷题笔记day01-数组
704 题 主要强调,左闭右闭的情况,就是每次查询都会和 [left, right] 进行比较。所以后面的都是mid-1,mid1 的情况。 package mainfunc search(nums []int, target int) int {// 二分查找方法// 每次查找都是左闭右闭的情况left : 0right : …...

C#调用C++ 的DLL传送和接收中文字符串
1 c#向c传送中文字符串 设置:将 字符集 改为 使用多字节字符集 cpp代码: extern "C"_declspec(dllexport) int input_chn_str(char in_str[]) {cout<<in_str<<endl;return 0; }c#代码: [DllImport("Demo.dll…...

【MySQL】数据库常见错误及解决
目录 2003错误:连接错误1251错误:身份验证错误1045错误:拒绝访问错误服务没有报告任何错误net start mysql 发生系统错误 5。 1064错误:语法错误1054错误:列名不存在1442错误:触发器中不能对本表增删改1303…...

spring常见问题汇总
1. 什么是spring? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务 逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架, 为开…...
java8 Lambda表达式以及Stream 流
Lambda表达式 Lambda表达式规则 Lambda表达式可以看作是一段可以传递的代码, Lambda表达式只能用于函数式接口,而函数式接口只有一个抽象方法,所以可以省略方法名,参数类型等 Lambda格式:(形参列表&…...

基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

【蓝桥】小蓝的疑问
1、题目 问题描述 小蓝和小桥上完课后,小桥回顾了课上教的树形数据结构,他在地上画了一棵根节点为 1 的树,并且对每个节点都赋上了一个权值 w i w_i wi。 小蓝对小桥多次询问,每次询问包含两个整数 x , k x,k x,kÿ…...

漏洞复现-海康威视综合安防管理平台信息泄露【附Poc】
目录 【产品介绍】 【产品系统UI】 【漏洞说明】 【指纹】 【Nuclei Poc】 【验证】 【产品介绍】 海康威视(Hikvision)是一家总部位于中国杭州的公司,是全球最大的视频监控产品供应商。除了传统的CCTV摄像机和网络摄像机,海…...

【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了
【侵权联系删除】【文/郑尔巴金】 深度爆料,《完美世界》动漫第135集预告片已经更新了,但是网友们对此却是一脸槽点。从预告中可以看出,石昊在和战王战天歌的大战中被打成重伤,最后云曦也被战天歌抓住。在云曦面临生死危机的时候…...

34二叉树-BFS和DFS求树的深度
目录 LeetCode之路——104. 二叉树的最大深度 分析 解法一:广度优先遍历 解法二:深度优先遍历 总结 深度优先搜索 (DFS) 广度优先搜索 (BFS LeetCode之路——104. 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的…...
Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin
Android Glide判断图像资源是否缓存onlyRetrieveFromCache,使用缓存数据,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.util.Log import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity…...
设计模式之创建型模式
创建型模式与对象的创建有关。 创建型模式抽象了对象实例化的过程,这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。创建型模式有以下 工厂模式(Factory Method) 意图…...

使用jdbc技术连接数据库
连接数据库 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>compile</scope></dependency> </dependencies> g…...
OpenLayers入门,快速搭建vue+OpenLayers地图脚手架项目
专栏目录: OpenLayers入门教程汇总目录 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers地图库依赖,编写简单的xyz高德地图显示页面的完整教…...
完成比写得好更重要,先完成初稿再说
我发现自己有个毛病,总想着满意了才动手。于是,经常做到一半跑去看文献,然后陷入文献中觉得这个比自己好,那个比自己好。于是,暂时中断手边工作,最后进度被推迟,甚至啥也没做出来。 今晚再次听…...
Spring boot 处理复杂json接收,同种类型、不同场景处理
场景: json大体格式一致,但是 ext_info 扩展字段对象,场景不同字段不同根据某字段类型,不同值,对应不同实现的 Component,处理不同场景这里根据 event,来做不同处理 {"data": {"event"…...
排列置换环上构造:1025T3
http://cplusoj.com/d/senior/p/SS231025C 排列构造的新知识:上置换环! 我们发现朴素做法是 n 2 n^2 n2 级别的,但数据范围希望我们是 n 2 2 \frac {n^2}2 2n2 级别的。我们发现我们暴力复制序列显得非常蠢,因为很多序列前后…...
Stable diffusion的一些参数意义及常规设置
在线stabel Diffusion模型 https://huggingface.co/spaces/stabilityai/stable-diffusion 随机种子 seed 如果想要同一个文本提示,生成多次都是同一图像,可以设置一个随机种子,类似于random.seed()的原理,并将生成器传递给管道。…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...