From bf4a9f48eb8328446aa3db398f0aa6d3d035a1e3 Mon Sep 17 00:00:00 2001 From: Josh Knapp Date: Sun, 12 Jul 2026 18:31:25 -0700 Subject: [PATCH] security: block data:image/svg+xml + sandbox HtmlBlock iframes M-5: safeUrl() blocked javascript:/vbscript:/data:text/html but allowed data:image/svg+xml, which can execute inline '); + expect(out).not.toContain('onload'); + expect(out).not.toContain(' { + purifyHtml(''); + purifyHtml(''); + const out = purifyHtml(''); + const sandboxMatches = out.match(/sandbox="/g) || []; + expect(sandboxMatches.length).toBe(1); + }); + + test('a non-iframe element sanitized alongside an iframe is not touched by the hook', () => { + const out = purifyHtml('

hi

'); + expect(out).toContain('

hi

'); + }); +}); diff --git a/craft/src/components/basic/HtmlBlock.tsx b/craft/src/components/basic/HtmlBlock.tsx index 4fa7f8a..0f41cc4 100644 --- a/craft/src/components/basic/HtmlBlock.tsx +++ b/craft/src/components/basic/HtmlBlock.tsx @@ -24,14 +24,42 @@ const PURIFY_CONFIG = { 'href','src','alt','title','target','rel', 'width','height','class', 'allowfullscreen','allow','frameborder', + 'sandbox','referrerpolicy', ], ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|data:image\/[a-z]+;base64,):|[^a-z]|[a-z+.-]+(?:[^a-z+.\-:]|$))/i, FORBID_TAGS: ['script','style','object','embed','link','meta','form','input','button','select','textarea'], FORBID_ATTR: [/^on/i], }; +// M-6: `