fix DOM XSS via unvalidated form redirects (#120)

* implement safe url validation for redirects

added validation for safe redirect urls to prevent xss attacks

* add changeset: fix dom xss in form redirects
(marked as patch version bump for @emdash-cms/plugin-forms)

---------

Co-authored-by: Matt Kane <mkane@cloudflare.com>
This commit is contained in:
jul
2026-04-04 16:51:36 +02:00
committed by GitHub
parent 9ebc8b1f3f
commit 66beb4da1f
2 changed files with 22 additions and 1 deletions

View File

@@ -0,0 +1,5 @@
---
"@emdash-cms/plugin-forms": patch
---
Fix DOM XSS in form redirects

View File

@@ -137,11 +137,17 @@ async function handleSubmit(e: Event) {
if (result.success) { if (result.success) {
clearSavedState(form); clearSavedState(form);
if (result.redirect) { if (result.redirect) {
// prevent xss
if (isSafeRedirectUrl(result.redirect)) {
window.location.href = result.redirect; window.location.href = result.redirect;
} else { } else {
showStatus(form, result.message || "Submitted successfully.", "success"); showStatus(form, result.message || "Submitted successfully.", "success");
form.reset(); form.reset();
} }
} else {
showStatus(form, result.message || "Submitted successfully.", "success");
form.reset();
}
} else if (result.errors) { } else if (result.errors) {
showErrors(form, result.errors); showErrors(form, result.errors);
} else { } else {
@@ -157,6 +163,16 @@ async function handleSubmit(e: Event) {
} }
} }
/** validates that a redirect url uses a safe protocol */
function isSafeRedirectUrl(url: string): boolean {
try {
const parsed = new URL(url, window.location.href);
return ["http:", "https:", "mailto:", "tel:"].includes(parsed.protocol);
} catch {
return false;
}
}
// ─── Click Handler (Prev/Next) ─────────────────────────────────── // ─── Click Handler (Prev/Next) ───────────────────────────────────
function handleClick(e: Event) { function handleClick(e: Event) {