diff --git a/navigator/src/epub/frame/FrameBlobBuilder.ts b/navigator/src/epub/frame/FrameBlobBuilder.ts index 169e3f3b..d931691e 100644 --- a/navigator/src/epub/frame/FrameBlobBuilder.ts +++ b/navigator/src/epub/frame/FrameBlobBuilder.ts @@ -50,7 +50,10 @@ const cssSelectorGenerator = (doc: Document) => scriptify(doc, cached("css-selec // Note: we aren't blocking some of the events right now to try and be as nonintrusive as possible. // For a more comprehensive implementation, see https://github.com/hackademix/noscript/blob/3a83c0e4a506f175e38b0342dad50cdca3eae836/src/content/syncFetchPolicy.js#L142 +// The snippet of code at the beginning of this source is an attempt at defence against JS using persistent storage const rBefore = (doc: Document) => scriptify(doc, cached("JS-Before", () => blobify(stripJS(` + const noop=()=>{},emptyObj={},emptyPromise=()=>Promise.resolve(void 0),fakeStorage={getItem:noop,setItem:noop,removeItem:noop,clear:noop,key:noop,length:0};["localStorage","sessionStorage"].forEach((e=>Object.defineProperty(window,e,{get:()=>fakeStorage,configurable:!0}))),Object.defineProperty(document,"cookie",{get:()=>"",set:noop,configurable:!0}),Object.defineProperty(window,"indexedDB",{get:()=>{},configurable:!0}),Object.defineProperty(window,"caches",{get:()=>emptyObj,configurable:!0}),Object.defineProperty(navigator,"storage",{get:()=>({persist:emptyPromise,persisted:emptyPromise,estimate:()=>Promise.resolve({quota:0,usage:0})}),configurable:!0}),Object.defineProperty(navigator,"serviceWorker",{get:()=>({register:emptyPromise,getRegistration:emptyPromise,ready:emptyPromise()}),configurable:!0}); + window._readium_blockedEvents = []; window._readium_blockEvents = true; window._readium_eventBlocker = (e) => { @@ -78,6 +81,24 @@ const rAfter = (doc: Document) => scriptify(doc, cached("JS-After", () => blobif });` ), "text/javascript"))); +const csp = (domains: string[]) => { + const d = domains.join(" "); + return [ + // 'self' is useless because the document is loaded from a blob: URL + `upgrade-insecure-requests`, + `default-src ${d} blob:`, + `connect-src 'none'`, // No fetches to anywhere. TODO: change? + `script-src ${d} blob: 'unsafe-inline'`, // JS scripts + `style-src ${d} blob: 'unsafe-inline'`, // CSS styles + `img-src ${d} blob: data:`, // Images + `font-src ${d} blob: data:`, // Fonts + `object-src ${d} blob:`, // Despite not being recommended, still necessary in EPUBs for + `child-src ${d}`, //