Skip to content

Commit 7ff5ae3

Browse files
authored
Fix X-Forwarded-Host overwriting (#521)
1 parent d26b6e7 commit 7ff5ae3

File tree

3 files changed

+47
-10
lines changed

3 files changed

+47
-10
lines changed

pkg/constant/constant.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ const (
5151

5252
_ contextKey = iota
5353
ContextScopeName
54-
HeaderXForwardedFor = "X-Forwarded-For"
55-
HeaderXRealIP = "X-Real-IP"
56-
HeaderXHMAC = "X-HMAC-SHA256"
54+
HeaderXForwardedFor = "X-Forwarded-For"
55+
HeaderXForwardedHost = "X-Forwarded-Host"
56+
HeaderXRealIP = "X-Real-IP"
57+
HeaderXHMAC = "X-HMAC-SHA256"
5758

5859
DurationType = "time.Duration"
5960

pkg/proxy/middleware/base.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,11 @@ func ProxyMiddleware(
322322
// @step: add the proxy forwarding headers
323323
req.Header.Set("X-Real-IP", utils.RealIP(req))
324324
if xff := req.Header.Get(constant.HeaderXForwardedFor); xff == "" {
325-
req.Header.Set("X-Forwarded-For", utils.RealIP(req))
326-
} else {
327-
req.Header.Set("X-Forwarded-For", xff)
325+
req.Header.Set(constant.HeaderXForwardedFor, utils.RealIP(req))
326+
}
327+
if xfh := req.Header.Get(constant.HeaderXForwardedHost); xfh == "" {
328+
req.Header.Set(constant.HeaderXForwardedHost, req.Host)
328329
}
329-
req.Header.Set("X-Forwarded-Host", req.Host)
330-
req.Header.Set("X-Forwarded-Proto", req.Header.Get("X-Forwarded-Proto"))
331330

332331
if len(corsOrigins) > 0 {
333332
// if CORS is enabled by Gatekeeper, do not propagate CORS requests upstream

pkg/testsuite/server_test.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1518,7 +1518,7 @@ func TestXForwarded(t *testing.T) {
15181518
ExecutionSettings []fakeRequest
15191519
}{
15201520
{
1521-
Name: "TestEmptyXForwarded",
1521+
Name: "TestEmptyXForwardedFor",
15221522
ProxySettings: func(_ *config.Config) {
15231523
},
15241524
ExecutionSettings: []fakeRequest{
@@ -1535,7 +1535,7 @@ func TestXForwarded(t *testing.T) {
15351535
},
15361536
},
15371537
{
1538-
Name: "TestXForwardedPresent",
1538+
Name: "TestXForwardedForPresent",
15391539
ProxySettings: func(_ *config.Config) {
15401540
},
15411541
ExecutionSettings: []fakeRequest{
@@ -1574,6 +1574,43 @@ func TestXForwarded(t *testing.T) {
15741574
},
15751575
},
15761576
},
1577+
{
1578+
Name: "TestEmptyXForwardedHost",
1579+
ProxySettings: func(_ *config.Config) {
1580+
},
1581+
ExecutionSettings: []fakeRequest{
1582+
{
1583+
URI: FakeAuthAllURL + FakeTestURL,
1584+
HasToken: true,
1585+
ExpectedProxy: true,
1586+
ExpectedProxyHeadersValidator: map[string]func(*testing.T, *config.Config, string){
1587+
"X-Forwarded-Host": func(t *testing.T, _ *config.Config, value string) {
1588+
assert.Contains(t, value, "127.0.0.1")
1589+
},
1590+
},
1591+
ExpectedCode: http.StatusOK,
1592+
},
1593+
},
1594+
},
1595+
{
1596+
Name: "TestXForwardedHostPresent",
1597+
ProxySettings: func(_ *config.Config) {
1598+
},
1599+
ExecutionSettings: []fakeRequest{
1600+
{
1601+
URI: FakeAuthAllURL + FakeTestURL,
1602+
HasToken: true,
1603+
ExpectedProxy: true,
1604+
Headers: map[string]string{
1605+
"X-Forwarded-Host": "189.10.10.1",
1606+
},
1607+
ExpectedProxyHeaders: map[string]string{
1608+
"X-Forwarded-Host": "189.10.10.1",
1609+
},
1610+
ExpectedCode: http.StatusOK,
1611+
},
1612+
},
1613+
},
15771614
}
15781615

15791616
for _, testCase := range testCases {

0 commit comments

Comments
 (0)