Skip to content

Commit 33c9501

Browse files
authored
Merge pull request #4495 from terraincognita07/backport-v2-balancer-forward-x-real-ip
🐛 fix(proxy): backport BalancerForward X-Real-IP overwrite fix to v2
2 parents 6772121 + 1b071e1 commit 33c9501

3 files changed

Lines changed: 29 additions & 2 deletions

File tree

docs/api/middleware/proxy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ app.Use(proxy.Balancer(proxy.Config{
122122
"http://localhost:3003",
123123
},
124124
ModifyRequest: func(c *fiber.Ctx) error {
125-
c.Request().Header.Add("X-Real-IP", c.IP())
125+
c.Request().Header.Set("X-Real-IP", c.IP())
126126
return nil
127127
},
128128
ModifyResponse: func(c *fiber.Ctx) error {

middleware/proxy/proxy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ func BalancerForward(servers []string, clients ...*fasthttp.Client) fiber.Handle
261261
if !strings.HasPrefix(server, "http") {
262262
server = "http://" + server
263263
}
264-
c.Request().Header.Add("X-Real-IP", c.IP())
264+
c.Request().Header.Set("X-Real-IP", c.IP())
265265
return Do(c, server+c.OriginalURL(), clients...)
266266
}
267267
}

middleware/proxy/proxy_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,3 +740,30 @@ func Test_Proxy_Balancer_Forward_Local(t *testing.T) {
740740

741741
utils.AssertEqual(t, string(b), "forwarded")
742742
}
743+
744+
// go test -run Test_Proxy_Balancer_Forward_OverwritesXRealIP
745+
func Test_Proxy_Balancer_Forward_OverwritesXRealIP(t *testing.T) {
746+
t.Parallel()
747+
748+
const (
749+
spoofedIP = "10.0.0.1"
750+
appTestClientIP = "0.0.0.0"
751+
)
752+
753+
_, addr := createProxyTestServerIPv4(t, func(c *fiber.Ctx) error {
754+
value := c.Get("X-Real-IP")
755+
utils.AssertEqual(t, appTestClientIP, value)
756+
utils.AssertEqual(t, false, value == spoofedIP)
757+
return c.SendStatus(fiber.StatusOK)
758+
})
759+
760+
app := fiber.New()
761+
app.Use(BalancerForward([]string{addr}))
762+
763+
req := httptest.NewRequest(fiber.MethodGet, "/", nil)
764+
req.Header.Set("X-Real-IP", spoofedIP)
765+
766+
resp, err := app.Test(req)
767+
utils.AssertEqual(t, nil, err)
768+
utils.AssertEqual(t, fiber.StatusOK, resp.StatusCode)
769+
}

0 commit comments

Comments
 (0)