当Host头存在时如何确定请求的真实serverPort [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当Host头存在时如何确定请求的真实serverPort [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我有一个启动管理端点的Spring启动应用程序。这意味着应用程序在端口8080上启动,管理端点在端口8081上可用。

使用Spring安全性保护应用程序,但是,无需身份验证即可访问管理端点。所以我添加了一个请求匹配器,用于评估服务器端口(使用request.getServerPort())以忽略对端口8081上的管理端点的所有请求。

现在碰巧当存在Host头时,此头的端口在request.getServerPort()中返回,而不是真实的服务器端口。

这意味着我可以使用带有端口8081的Host标头访问应用程序并绕过Spring Security !?

清晰的例子:

curl localhost:8080
returns 401 (unauthorized, that's correct)

curl localhost:8081/health
returns 200 (found)

curl -H "Host: localhost:8081" localhost:8080
returns 200 (wtf?) - because request.getServerPort() == 8081

curl -H "Host: localhost:8080" localhost:8081/health
returns 401 - because request.getServerPort() == 8080

问题是:如何确定应用程序接收请求的真实端口?

答案
ServletRequest#getLocalName() returns local hostname.
ServletRequest#getLocalAddr() returns local IP.
ServletRequest#getLocalPort() returns local port.

为了更加清晰,请参阅:Get Application Server name or ip and port in Java

以上是关于当Host头存在时如何确定请求的真实serverPort [重复]的主要内容,如果未能解决你的问题,请参考以下文章

weblogichost头攻击配置

检测到目标URL存在http host头攻击漏洞怎么修复

HTTP Host 头攻击,这是什么鬼?

HTTP Host 头攻击,这是什么鬼?

跟我学Nginx,nginx 如何处理请求?

Nginx结合腾讯云CLB完成请求头Host重写