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

这篇具有很好参考价值的文章主要介绍了【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上面突然说,需要检查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_set_header x-forwarded-host,Nginx,nginx,tcp/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 地址文章来源地址https://www.toymoban.com/news/detail-826120.html

到了这里,关于【Nginx】proxy_set_header的变量与X-Forwarded-For伪造客户端IP漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx负载均衡代理proxy_set_header设置和透传https协议

    最近基于Nginx + (Nginx + PHP7)的技术生态做负载均衡,其中PHP框架使用的是ThinkPHP5,支付业务中使用了微信支付,其中有一处逻辑:获取当前请求的域名并且微信支付的回调地址 thinkRequest::instance()-domain() ,本来小程序端访问的是https协议,做了负载均衡之后,在程序中获取到的

    2024年01月25日
    浏览(42)
  • nginx.conf报错:“set“ directive is not allowed here in xxx(http块下不能用set定义变量)

    在nginx.conf的http块中定义变量: 在server块中使用变量替换IP地址: 然后nginx容器启动的时候就报错了: 原因:我不该把这句直接加到http块下, 要这样加到http块下的server块下的location里: 这样就没问题 但是我又另外报了一个错误: using uninitialized \\\"server_ip_addr\\\" variable 我另外记

    2024年02月13日
    浏览(35)
  • http.header.Set()与Add()区别;

    在Go语言中进行HTTP请求时, http.Header 对象表示HTTP请求或响应的头部信息。 http.Header 是一个 map[string][]string 类型的结构,用于存储键值对,其中键表示HTTP头字段的名称,值是一个字符串切片,可以存储多个相同名称的头字段值。 http.Header 提供了两个主要的方法来设置头部字

    2024年02月07日
    浏览(38)
  • Refused to set unsafe header “cookie“

    记 web端微信登陆之后,保存登录状态的问题: 发送给后台的后续请求在head添加 但是报错 Refused to set unsafe header “cookie” 原因是w3c中不允许手动设置cookie 解决方法: 1.把Cookie改成Authorization,让后端从Authorization中拿到相关登录信息; 2.前端来做登录,每次发送openid给后台,

    2024年02月06日
    浏览(51)
  • ngx_http_set_response_header阅读

    1.关于设置头的一些函数指针初始化 2.设置header的初始化函数 3.ngx_http_set_response_header阅读理解 4.最终的执行是在ngx_http_headers_filter函数中 5.ngx_array_t的定义 6.看一看special_header的处理-ngx_http_send_error_page

    2024年02月05日
    浏览(50)
  • [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

    如果你的node.js提示: [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 那么,代表你返回了结果,但是最后你又不小心再返回了一次。通常是由于方法没有进行等待,或者多条件判断缺漏造成的。 情况一:返回机制问题 通过success/error模式来返回结果,取消最终的

    2024年02月10日
    浏览(51)
  • Nginx Proxy服务器 Proxy缓存模块

    Proxy缓存 缓存类型 网页缓存 (公网)CDN 数据库缓存 memcache redis 网页缓存 nginx-proxy 客户端缓存 浏览器缓存 模块 ngx_http_proxy_module 语法 缓存开关 Syntax: proxy_cache zone | off; Default: proxy_cache off; Context: http, server, location 代理缓存 Syntax: proxy_cache_path path [levels=levels] keys_zone=name:size[

    2024年02月02日
    浏览(40)
  • 使用Charles小贴士之报错(Notes SSL Proxying not enabled for this host: enable in Proxy Settings)

    (报错的总结持续更新,报错单独写这样好找一点) 报错1: SSL Proxying not enabled for this host: enable in Proxy Settings 昨天用还好好的,今天使用就报(Notes        SSL Proxying not enabled for this host: enable in Proxy Settings) 原因是:我手机wifi代理IP搞错了,在电脑的cmd找ip地址跟charles了的地

    2024年02月03日
    浏览(47)
  • Nginx Proxy反向代理

    反向代理是一种网络架构,它通过将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端,实现了客户端和服务器之间的间接通信。与正向代理不同,正向代理是代理客户端,而反向代理是代理服务器。 以下是反向代理的基本原理: 客户端发起请求: 客户

    2024年01月20日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包