fix(frontend): sanitize redirect targets to prevent XSS/open redirect

Sanitize and validate redirect targets from callbackUrl parameter and sessionStorage in login, registration, and OAuth callback flows.
Introduced safeRedirectTarget helper which rejects protocol-relative URLs, non-relative schemes, control characters, backslashes, and encoding bypasses.
This commit is contained in:
ryan
2026-06-13 09:51:30 +08:00
parent 50d21b431b
commit f48426dbf8
4 changed files with 61 additions and 4 deletions
+4 -2
View File
@@ -18,6 +18,7 @@ import {AuthHeading} from "@/components/auth/auth-shell"
import {OTPForm} from "./otp-form"
import services from "@/lib/services"
import type {LoginRequest} from "@/lib/services/auth/types"
import {safeRedirectTarget} from "@/lib/utils"
function getRedirectTarget(searchParams: ReturnType<typeof useSearchParams>) {
const callbackUrl = searchParams.get("callbackUrl")
@@ -31,16 +32,17 @@ function getRedirectTarget(searchParams: ReturnType<typeof useSearchParams>) {
sessionStorage.removeItem("redirect_after_login")
}
return target
return safeRedirectTarget(target)
}
function persistRedirectTarget(searchParams: ReturnType<typeof useSearchParams>) {
const callbackUrl = searchParams.get("callbackUrl")
if (callbackUrl && typeof window !== "undefined") {
sessionStorage.setItem("redirect_after_login", callbackUrl)
sessionStorage.setItem("redirect_after_login", safeRedirectTarget(callbackUrl))
}
}
function configBool(value: string | undefined, fallback: boolean) {
if (value === undefined) return fallback
return value === "true"