【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞

news2024/12/23 3:39:25

前言

上面突然说,需要检查Nginx反向代理的安全问题并给出了修改方法,小白的我一脸懵逼,明明都是中文,连在一起咋就看不明白了。于是乎,对着修改内容简单学习了一下,在此做个记录,如有问题请大佬们指点指点。

1、proxy_set_header的参数

在Nginx中的location里,我们通常会配置proxy_set_header,如下代码:

# 定义转发分配规则
upstream kwtest {
	server ip1:port;
	server ip2:port;
}

server {
	listen	8080; # Nginx监听端口

	location /testApi {
		# 反向代理
		proxy_pass http://kwtest;
		# 在原本的nginx中,这个是默认的
		proxy_set_header Host $http_host;
	}
}

1.1 具体参数

这里来解释一下这个参数$http_host,以及后面会讲到的参数。

proxy_set_header参数含义
$http_host请求头中的完整的主机名或IP地址(包括端口号)
$host请求头中的Host字段,主机名或IP地址(不包括端口号)
$remote_addr是客户端的IP地址
$proxy_add_x_forwarded_for获取客户端真实的 IP 地址

1.2 客户端请求过来的 HTTP 请求头中的主机名或IP地址,与客户端的 IP 地址有什么不同

  • 客户端请求过来的 HTTP 请求头中的主机名或IP地址:这里的IP不是客户端的IP,是服务器端的IP【eg.系统部署的地方】
  • 客户端的 IP 地址:用户的IP地址【eg.浏览器打开的页面】

1.3 客户端的IP地址 与 获取客户端真实的 IP 地址有什么不同

$remote_addr是 Nginx 服务器记录的发起连接的客户端 IP 地址,是从网络层获取的客户端 IP,也就是请求到达 Nginx 服务器的 IP 地址。这个变量通常在直接与客户端通信的情况下使用,例如,客户端直接请求 Nginx 服务器时,可以通过$remote_addr获取客户端的真实 IP 地址。

$proxy_add_x_forwarded_for是 Nginx 在作为反向代理服务器时,从 HTTP 请求头中提取客户端的真实 IP 地址。当 Nginx 作为反向代理服务器时,客户端请求会经过反向代理服务器,再由反向代理服务器转发给后端的真实服务器处理。在这个过程中,Nginx 在请求头中添加了 X-Forwarded-For 字段,并将客户端的真实 IP 地址追加到该字段的末尾。$proxy_add_x_forwarded_for可以从这个字段中提取出客户端的真实 IP 地址,从而获取客户端的真实 IP 地址。

因此,$remote_addr$proxy_add_x_forwarded_for都是用于获取客户端 IP 地址的,但是 $remote_addr 适用于直接与客户端通信的场景,而 $proxy_add_x_forwarded_for 适用于 Nginx 作为反向代理服务器时获取客户端真实 IP 地址的场景,二者的使用场景不同。

2、X-Forwarded-For伪造客户端IP漏洞

这部分主要看利用X-Forwarded-For伪造客户端IP漏洞成因及防范这篇文章。虽然很详细,但理解完后,过一段时间忘了又得再理解。因此,以下内容主要对这篇文章的总结,快速回忆。

在这里插入图片描述

  • 注意:
    $proxy_add_x_forwarded_for 会将和Nginx直接连接的客户端IP追加在请求原有X-Forwarded-For值的右边。
    $remote_addr 这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。
  1. 存在多层Nginx情况下:
# 外层
server {
	listen	8080; # Nginx监听端口

	location /testApi1 {
		# 反向代理
		proxy_pass http://kwtest1;
		proxy_set_header X-Forwarded-For $remote_addr;
	}
}

# 内层
server {
	listen	8080; # Nginx监听端口

	location /testApi2 {
		# 反向代理
		proxy_pass http://kwtest2;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

如果有多层代理,那么只要在直接对外访问的Nginx上配置X-Forwarded-For为$remote_addr,内部层的Nginx还是要配置为$proxy_add_x_forwarded_for,不然内部层的Nginx又会覆盖掉客户端的真实IP。

  1. 单层Nginx,即对内又对外的情况:
# 内外层
server {
	listen	8080; # Nginx监听端口

	location /testApi3 {
		# 反向代理
		proxy_pass http://kwtest3;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

X-Real-IP 头部会包含真实的客户端 IP 地址,X-Forwarded-For 头部会包含一个逗号分隔的 IP 地址列表,其中第一个 IP 地址应该是真实的客户端 IP 地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中

【Ubuntu】Ubuntu14 安装 open-jdk-1.7(open-jdk-7) 最新 持续更新中 一、概述二、特别说明三、开发环境四、安装 open-jdk-1.7五、配置环境1、配置环境变量路径2、环境变量3、完成安装 一、概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。…

Hive3.1.2伪分布式安装

Hive3.1.2安装 前言 Hive是何物,自己去百度,在此不多bb,直接开整… 学习一个组件,个人觉得最重要的是先学会安装再说,巧妇难为无米之炊撒… 下载 下载地址:https://downloads.apache.org/hive/hive-3.…

Python探索金融数据进行时间序列分析和预测

大家好,时间序列分析是一种基于历史数据和趋势分析进行预测的统计技术。它在金融和经济领域非常普遍,因为它可以准确预测趋势并做出明智的决策。本文将使用Python来探索经济和金融数据,执行统计分析,并创建时间序列预测。 我们将…

面试题更新之-CSS Hack是什么?ie6,7,8的hack分别是什么?

文章目录 导文CSS Hack的定义广泛应用的CSS Hack技巧ie6,7,8的hack分别是什么? 导文 面试题更新之-CSS Hack是什么?ie6,7,8的hack分别是什么? CSS Hack的定义 CSS Hack指的是在CSS中使用一些特定的代码或技巧,通过利用不同浏览器对CSS实现的…

大学生用一周时间给麦当劳做了个App(安卓版)

背景 有个大学生粉丝最近私信联系我,说基于我之前开源的多语言项目做了个仿麦当劳的项目,虽然只是个样子货,但是收获颇多,希望把自己写的代码开源出来供大家一起学习进度。这个小伙伴确实是非常积极上进,很多大学生&a…

Grid++Report 6.8.6 Crack

GridReport报表开发工具总体介绍 报表开发工具概述 GridReport是一款同时支持C/S软件(桌面程序)与B/S软件(WEB程序)开发的报表工具,功能全面易学易用。C/S开发适用于VB.NET、C#、VB、VC、Delphi、CBuilder、QT与易语言等。B/S开发适用于ASP.NET(C# & VB.NET),…

蒲公英打包环境搭建碰到问题

一:证书那边选择手动,不要自动,——》debug配置dev证书,release配置ad-hoc证书 二:证书有时候不生效,删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三:更新测试手机时&#…

数字化孪生技术在工业上的应用场景和案例分享

编者按:数字化孪生是一个完整的生命周期概念,它从设计和制造开始,贯穿整个生产过程,直到产品退役。数字化孪生将现实世界和虚拟世界相结合,使企业能够更好地理解和优化物理系统的运行情况,从而提高生产效率…

Java多线程下的单例模式参考

Java多线程下的单例模式参考 单例有多种的写法,本例是懒汉式单例的一种写法。在高并发环境下需要注意的是: 1.单例在并发访问并调用其相应的getInstance方法的时候也会造成创建多个实例对象,加锁是必要的。 2.使用synchronized是比较好的解…

基于预测控制模型的自适应巡航控制仿真与机器人实现(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 自适应巡航控制技术为目前由于汽车保有量不断增长而带来的行车安全、驾驶舒适性及交通拥堵等问题提供了一条有效的解决途径&am…

JS、Vue鼠标拖拽

JS代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

Python Web框架 Flask 安装、使用

Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: [rootlocalhost web]# pip3 install Flask Collecting FlaskDownloading Flask-2.0.3-py3-none-any.whl (95 kB)|██████████████████████████████…

七大排序算法——归并排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、归并排序核心思想代码实现 三、性能分析四、七大排序算法性能对比 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0…

基于Java的考研教室在线预约系统/基于springboot的考研教室在线预约系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把考研教室在线预约与现在网络相结合&#xff0c;利用java语言建设考研教室在线预约系统&#xff0c;实现考研教室在线预约的信息化。则对于进一步提高考研教室在线预约发展&#xff0c;丰富考研教室在线预约能起到不少的促进…

Spark编程-RDD

RDD创建方式 第一种&#xff1a; 读取外部数据集。例如&#xff1a;从本地文件加载数据集&#xff0c;或者从HDFS文件系统、HBase等外部数据源中加载数据集。 Spark可以支持文本文件、SequenceFile文件&#xff08;Hadoop提供的 SequenceFile是一个由二进制序列化过的key/valu…

MySQL的数据备份与还原--练习题

MySQLdump MySQLdump是MySQL提供的一个非常有用的数据库备份工具。MySQLdump命令执行时&#xff0c;可以将数据库备份成一个文本文件&#xff0c;该文件中实际上包含了多个CREATE 和 INSERT语句&#xff0c;使用这些语句可以重新创建表和插入数据。 看题&#xff1a; 第一题&a…

开源共建,360推出WatchAD2.0域安全威胁感知系统新版本

不论是在攻防演练还是真实入侵对抗场景中&#xff0c;攻击者往往通过攻击域控获取特权管理权限进而横向控制企业内网&#xff0c;窃取重要资产和数据&#xff0c;凭借独特的管理优势&#xff0c;AD域被广泛应用于大型企业的IT基础设施的集中管理。 然而&#xff0c;传统的网络…

【手撕C语言基础】结构体(2)

(꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误…

微服务-Nacos环境安装

文章目录 1. 微服务1.1 微服务概括 2. 微服务框架2.1 Spring Cloud2.2 Spring Cloud alibaba/Spring Cloud Netflix2.3微服务框架组件(alibaba) 3 Nacos3.1 Nacos介绍3.3 Naocs工作结构3.3 Nacos功能3.4 环境准备下载安装 1. 微服务 1.1 微服务概括 单体架构有问题,所以做项目…

【uniapp开发小程序】设置开屏广告,广告图片全屏、覆盖自带胶囊导航

效果图&#xff1a; 点击跳转其他小程序&#xff1a; uni.navigateToMiniProgram() 官方文档&#xff1a;uni.navigateToMiniProgram(OBJECT) | uni-app官网 // 示例代码 uni.navigateToMiniProgram({appId: ,path: pages/index/index?id123,extraData: {data1: test},succes…