From 6b627d289cfbf3d2b327225adb478a5c12cad5a5 Mon Sep 17 00:00:00 2001 From: Philip Okugbe <16838612+Philipinho@users.noreply.github.com> Date: Tue, 29 Jul 2025 19:28:48 +0100 Subject: [PATCH] fix xss in generic iframe embed (#1419) --- .../editor/components/embed/embed-view.tsx | 16 ++++++++----- package.json | 1 + packages/editor-ext/src/lib/embed.ts | 23 +++++++++++++++---- packages/editor-ext/src/lib/utils.ts | 10 ++++++++ pnpm-lock.yaml | 3 +++ 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/apps/client/src/features/editor/components/embed/embed-view.tsx b/apps/client/src/features/editor/components/embed/embed-view.tsx index 414ccdaf..7ce7b1a6 100644 --- a/apps/client/src/features/editor/components/embed/embed-view.tsx +++ b/apps/client/src/features/editor/components/embed/embed-view.tsx @@ -21,6 +21,7 @@ import i18n from "i18next"; import { getEmbedProviderById, getEmbedUrlAndProvider, + sanitizeUrl, } from "@docmost/editor-ext"; import { ResizableWrapper } from "../common/resizable-wrapper"; import classes from "./embed-view.module.css"; @@ -51,9 +52,12 @@ export default function EmbedView(props: NodeViewProps) { validate: zodResolver(schema), }); - const handleResize = useCallback((newHeight: number) => { - updateAttributes({ height: newHeight }); - }, [updateAttributes]); + const handleResize = useCallback( + (newHeight: number) => { + updateAttributes({ height: newHeight }); + }, + [updateAttributes], + ); async function onSubmit(data: { url: string }) { if (!editor.isEditable) { @@ -63,11 +67,11 @@ export default function EmbedView(props: NodeViewProps) { if (provider) { const embedProvider = getEmbedProviderById(provider); if (embedProvider.id === "iframe") { - updateAttributes({ src: data.url }); + updateAttributes({ src: sanitizeUrl(data.url) }); return; } if (embedProvider.regex.test(data.url)) { - updateAttributes({ src: data.url }); + updateAttributes({ src: sanitizeUrl(data.url) }); } else { notifications.show({ message: t("Invalid {{provider}} embed link", { @@ -95,7 +99,7 @@ export default function EmbedView(props: NodeViewProps) { >