Skip to content

Commit 6c19f48

Browse files
authored
Merge pull request #4204 from aviu16/fix/csrf-referer-origin-matching
2 parents b2b8cc2 + a274da0 commit 6c19f48

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

middleware/csrf/csrf.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,14 +387,14 @@ func refererMatchesHost(c fiber.Ctx, trustedOrigins []string, trustedSubOrigins
387387
return nil
388388
}
389389

390-
referer = refererURL.String()
390+
refererOrigin := refererURL.Scheme + "://" + refererURL.Host
391391

392-
if slices.Contains(trustedOrigins, referer) {
392+
if slices.Contains(trustedOrigins, refererOrigin) {
393393
return nil
394394
}
395395

396396
for _, trustedSubOrigin := range trustedSubOrigins {
397-
if trustedSubOrigin.match(referer) {
397+
if trustedSubOrigin.match(refererOrigin) {
398398
return nil
399399
}
400400
}

middleware/csrf/csrf_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,38 @@ func Test_CSRF_TrustedOrigins(t *testing.T) {
13361336
ctx.Request.Header.SetCookie(ConfigDefault.CookieName, token)
13371337
h(ctx)
13381338
require.Equal(t, 403, ctx.Response.StatusCode())
1339+
1340+
// Test Trusted Referer with path — referer URL includes a path component
1341+
// which must not prevent matching against the trusted origin
1342+
ctx.Request.Reset()
1343+
ctx.Response.Reset()
1344+
ctx.Request.Header.SetMethod(fiber.MethodPost)
1345+
ctx.Request.Header.Set(fiber.HeaderXForwardedProto, "https")
1346+
ctx.Request.URI().SetScheme("https")
1347+
ctx.Request.URI().SetHost("example.com")
1348+
ctx.Request.Header.SetProtocol("https")
1349+
ctx.Request.Header.SetHost("example.com")
1350+
ctx.Request.Header.Set(fiber.HeaderReferer, "https://safe.example.com/some/path?q=1")
1351+
ctx.Request.Header.Set(HeaderName, token)
1352+
ctx.Request.Header.SetCookie(ConfigDefault.CookieName, token)
1353+
h(ctx)
1354+
require.Equal(t, 200, ctx.Response.StatusCode())
1355+
1356+
// Test Trusted Referer Wildcard with path — wildcard subdomain referer
1357+
// that includes a path must still match the trusted sub-origin
1358+
ctx.Request.Reset()
1359+
ctx.Response.Reset()
1360+
ctx.Request.Header.SetMethod(fiber.MethodPost)
1361+
ctx.Request.Header.Set(fiber.HeaderXForwardedProto, "https")
1362+
ctx.Request.URI().SetScheme("https")
1363+
ctx.Request.URI().SetHost("domain-1.com")
1364+
ctx.Request.Header.SetProtocol("https")
1365+
ctx.Request.Header.SetHost("domain-1.com")
1366+
ctx.Request.Header.Set(fiber.HeaderReferer, "https://safe.domain-1.com/api/callback?code=abc")
1367+
ctx.Request.Header.Set(HeaderName, token)
1368+
ctx.Request.Header.SetCookie(ConfigDefault.CookieName, token)
1369+
h(ctx)
1370+
require.Equal(t, 200, ctx.Response.StatusCode())
13391371
}
13401372

13411373
func Test_CSRF_TrustedOrigins_InvalidOrigins(t *testing.T) {

0 commit comments

Comments
 (0)