CSRF Token'ı SPA'da Unutmak
SameSite her yöntemi kapatmaz

Bearer'ı bellekten taşıyınca CSRF zayıf. Cookie'ye geçince tarayıcı cookie'yi kendisi ekler. Cross-site POST, eski form saldırısı, hâlâ bu yüzden çalışır. SameSite=Lax çoğu POST'u keser. Lax'in yetmediği yer: alt domain, eklenti, yanlışlıkla None.
Token'ı nereye koydum
builder.Services.AddAntiforgery(o =>
{
o.HeaderName = "X-CSRF-TOKEN";
o.Cookie.Name = "csrf";
o.Cookie.HttpOnly = false; // JS okuyup header'a koyacak
o.Cookie.SecurePolicy = CookieSecurePolicy.Always;
o.Cookie.SameSite = SameSiteMode.Strict;
});
app.MapGet("/api/auth/csrf", (IAntiforgery antiforgery, HttpContext ctx) =>
{
var tokens = antiforgery.GetAndStoreTokens(ctx);
return Results.Ok(new { token = tokens.RequestToken });
});
app.MapPost("/api/posts", async (CreatePost body, IAntiforgery antiforgery, HttpContext ctx) =>
{
await antiforgery.ValidateRequestAsync(ctx);
return Results.Created();
});
Double-submit: JS token'ı header'a yazar, cookie otomatik gider, sunucu ikisini karşılaştırır. Unuttuğum yer logout ve email-change idi. Login'e token koyup state değiştiren diğer POST'ları açık bırakmak, kapıyı kilitleyip pencereyi açık bırakmak.
Aynı sitede cookie + SPA ise token durur. Cross-site tamamen Bearer ise CSRF ikinci planda, XSS birinci. İkisini karıştırıp 'SPA'da CSRF olmaz' demek, cookie'ye geçtiğin gün bozulur.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap