Open Redirect'i "sadece internal" Sanmak
/ ile başlayan her yol iç yol değil

Login sonrası returnUrl ile yönlendirdim. 'Sadece / ile başlasın' filtresi //collector.example/x geçirdi. Tarayıcı bunu https://collector.example/x yaptı. Kullanıcı bizim origin'den çıktı, token fragment'ı da götürebildi.
app.MapPost("/api/auth/login", (LoginRequest body, HttpContext ctx) =>
{
if (!IsSafeLocal(body.ReturnUrl))
return Results.Redirect("/");
return Results.Redirect(body.ReturnUrl);
});
static bool IsSafeLocal(string? url) =>
!string.IsNullOrWhiteSpace(url)
&& Uri.IsWellFormedUriString(url, UriKind.Relative)
&& url.StartsWith('/')
&& !url.StartsWith("//")
&& !url.Contains('\\');
Url.IsLocalUrl aynı kaçışları keser; ben elle yazdığımda \\ ve encoded slash'ı unuttum. Absolute https://bizim.site/path de 'internal' değildir, origin sabitse açıkça o host'a bakılır. Prefix yetmez. Internal sandığım şey, tarayıcının dışarı saydığı şeydi.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap