1
0
mirror of https://github.com/gofiber/fiber.git synced 2025-02-24 07:25:38 +00:00
fiber/middleware/csrf/csrf_test.go

168 lines
4.1 KiB
Go
Raw Normal View History

2020-09-13 11:20:11 +02:00
package csrf
2020-09-14 05:47:17 +02:00
import (
"net/http/httptest"
2020-09-14 05:47:17 +02:00
"strings"
"testing"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
2020-09-14 05:47:17 +02:00
"github.com/valyala/fasthttp"
)
func Test_CSRF(t *testing.T) {
app := fiber.New()
app.Use(New())
app.Post("/", func(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusOK)
})
h := app.Handler()
ctx := &fasthttp.RequestCtx{}
// Generate CSRF token
ctx.Request.Header.SetMethod("GET")
h(ctx)
utils.AssertEqual(t, true, strings.Contains(string(ctx.Response.Header.Peek(fiber.HeaderSetCookie)), "_csrf"))
// Without CSRF cookie
ctx.Request.Reset()
ctx.Response.Reset()
ctx.Request.Header.SetMethod("POST")
h(ctx)
utils.AssertEqual(t, 403, ctx.Response.StatusCode())
// Empty/invalid CSRF token
ctx.Request.Reset()
ctx.Response.Reset()
ctx.Request.Header.SetMethod("POST")
ctx.Request.Header.Set("X-CSRF-Token", "johndoe")
h(ctx)
utils.AssertEqual(t, 403, ctx.Response.StatusCode())
// Valid CSRF token
token := utils.UUID()
ctx.Request.Reset()
ctx.Response.Reset()
ctx.Request.Header.SetMethod("POST")
ctx.Request.Header.Set(fiber.HeaderCookie, "_csrf="+token)
ctx.Request.Header.Set("X-CSRF-Token", token)
h(ctx)
utils.AssertEqual(t, 200, ctx.Response.StatusCode())
}
// go test -run Test_CSRF_Next
func Test_CSRF_Next(t *testing.T) {
app := fiber.New(fiber.Config{
DisableStartupMessage: true,
})
app.Use(New(Config{
Next: func(_ *fiber.Ctx) bool {
return true
},
}))
resp, err := app.Test(httptest.NewRequest("GET", "/", nil))
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, fiber.StatusNotFound, resp.StatusCode)
}
2020-09-16 11:15:10 +08:00
func Test_CSRF_Invalid_TokenLookup(t *testing.T) {
defer func() {
utils.AssertEqual(t, "csrf: Token lookup must in the form of <source>:<key>", recover())
}()
app := fiber.New()
app.Use(New(Config{TokenLookup: "I:am:invalid"}))
app.Post("/", func(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusOK)
})
h := app.Handler()
ctx := &fasthttp.RequestCtx{}
ctx.Request.Header.SetMethod("GET")
h(ctx)
}
func Test_CSRF_From_Form(t *testing.T) {
app := fiber.New()
app.Use(New(Config{TokenLookup: "form:_csrf"}))
app.Post("/", func(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusOK)
})
h := app.Handler()
ctx := &fasthttp.RequestCtx{}
// Valid CSRF token
token := utils.UUID()
ctx.Request.Header.SetMethod("POST")
ctx.Request.Header.Set(fiber.HeaderCookie, "_csrf="+token)
ctx.Request.Header.Set(fiber.HeaderContentType, fiber.MIMEApplicationForm)
h(ctx)
utils.AssertEqual(t, 403, ctx.Response.StatusCode())
ctx.Request.Reset()
ctx.Request.Header.SetMethod("POST")
ctx.Request.Header.Set(fiber.HeaderCookie, "_csrf="+token)
ctx.Request.Header.Set(fiber.HeaderContentType, fiber.MIMEApplicationForm)
ctx.Request.SetBodyString("_csrf=" + token)
h(ctx)
utils.AssertEqual(t, 200, ctx.Response.StatusCode())
}
func Test_CSRF_From_Query(t *testing.T) {
app := fiber.New()
app.Use(New(Config{TokenLookup: "query:_csrf"}))
app.Post("/", func(c *fiber.Ctx) error {
return c.SendStatus(fiber.StatusOK)
})
h := app.Handler()
ctx := &fasthttp.RequestCtx{}
// Valid CSRF token
token := utils.UUID()
ctx.Request.Header.SetMethod("POST")
ctx.Request.Header.Set(fiber.HeaderCookie, "_csrf="+token)
ctx.Request.SetRequestURI("/?_csrf=" + token)
h(ctx)
utils.AssertEqual(t, 200, ctx.Response.StatusCode())
ctx.Request.SetRequestURI("/")
ctx.Response.Reset()
h(ctx)
utils.AssertEqual(t, 403, ctx.Response.StatusCode())
utils.AssertEqual(t, "Forbidden", string(ctx.Response.Body()))
}
// TODO: failed
//func Test_CSRF_From_Param(t *testing.T) {
// app := fiber.New()
//
// app.Use(New(Config{TokenLookup:"param:csrf"}))
//
// app.Post("/:key/:csrf", func(c *fiber.Ctx) error {
// t.Log(c.Params("csrf"))
// return c.SendStatus(fiber.StatusOK)
// })
//
// h := app.Handler()
// ctx := &fasthttp.RequestCtx{}
//
// // Valid CSRF token
// token := utils.UUID()
// ctx.Request.Header.SetMethod("POST")
// ctx.Request.Header.Set(fiber.HeaderCookie, "_csrf="+token)
// ctx.Request.SetRequestURI("/key/" + token)
// h(ctx)
// utils.AssertEqual(t, 200, ctx.Response.StatusCode())
//}