diff --git a/CHANGELOG.md b/CHANGELOG.md index c9af701cc..efbc8f28e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Font-family variables that can be used to customise the sans-serif and monospace fonts used in the editor (#1264) - Material symbols font to web component preview page since the Design System depends on this (#1261) - Ability for plugins to add buttons to the SidebarPanel header (#1270, #1271, #1274) +- Prevent access to the session from within the editor (#1275) ### Changed diff --git a/src/components/Editor/Runners/HtmlRunner/HtmlRunner.jsx b/src/components/Editor/Runners/HtmlRunner/HtmlRunner.jsx index ae8a47720..5c153c681 100644 --- a/src/components/Editor/Runners/HtmlRunner/HtmlRunner.jsx +++ b/src/components/Editor/Runners/HtmlRunner/HtmlRunner.jsx @@ -306,55 +306,88 @@ function HtmlRunner() { if (!externalLink) { const indexPage = parse(focussedComponent(previewFile).content); const body = indexPage.querySelector("body") || indexPage; + const htmlRoot = indexPage.querySelector("html") ?? indexPage; - // insert script to disable access to specific localStorage keys - // localstorage.getItem() is a potential security risk when executing untrusted code const disableLocalStorageScript = ` - + `; + + const disableSessionStorageScript = ` + - `; - - body.insertAdjacentHTML("afterbegin", disableLocalStorageScript); + }; + [window, window.parent, window.top, document.defaultView].forEach(apply); + })(); + + `; + + htmlRoot.insertAdjacentHTML("afterbegin", disableLocalStorageScript); + htmlRoot.insertAdjacentHTML("afterbegin", disableSessionStorageScript); replaceHrefNodes(indexPage, projectCode); replaceSrcNodes(indexPage, projectMedia, projectCode); diff --git a/src/components/Editor/Runners/HtmlRunner/HtmlRunner.test.js b/src/components/Editor/Runners/HtmlRunner/HtmlRunner.test.js index 40ad19de9..e797c6cf7 100644 --- a/src/components/Editor/Runners/HtmlRunner/HtmlRunner.test.js +++ b/src/components/Editor/Runners/HtmlRunner/HtmlRunner.test.js @@ -289,19 +289,35 @@ describe("When run is triggered", () => { const [generatedHtml] = Blob.mock.calls[0][0]; expect(generatedHtml).toContain(""); + }); + test("Includes localSession disabling script to prevent all access to the session object", () => { + const [generatedHtml] = Blob.mock.calls[0][0]; + + expect(generatedHtml).toContain(""); }); });