diff --git a/.changeset/giant-years-drum.md b/.changeset/giant-years-drum.md new file mode 100644 index 000000000000..8631d138229e --- /dev/null +++ b/.changeset/giant-years-drum.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: add nonce or hash to "script-src-elem", "style-src-attr" and "style-src-elem" if defined in CSP config diff --git a/packages/kit/src/runtime/server/page/csp.js b/packages/kit/src/runtime/server/page/csp.js index a1a530d9d62e..6bd55f9c0c38 100644 --- a/packages/kit/src/runtime/server/page/csp.js +++ b/packages/kit/src/runtime/server/page/csp.js @@ -40,9 +40,18 @@ class BaseProvider { /** @type {import('types').Csp.Source[]} */ #script_src; + /** @type {import('types').Csp.Source[]} */ + #script_src_elem; + /** @type {import('types').Csp.Source[]} */ #style_src; + /** @type {import('types').Csp.Source[]} */ + #style_src_attr; + + /** @type {import('types').Csp.Source[]} */ + #style_src_elem; + /** @type {string} */ #nonce; @@ -57,6 +66,18 @@ class BaseProvider { const d = this.#directives; + this.#script_src = []; + this.#script_src_elem = []; + this.#style_src = []; + this.#style_src_attr = []; + this.#style_src_elem = []; + + const effective_script_src = d['script-src'] || d['default-src']; + const script_src_elem = d['script-src-elem']; + const effective_style_src = d['style-src'] || d['default-src']; + const style_src_attr = d['style-src-attr']; + const style_src_elem = d['style-src-elem']; + if (__SVELTEKIT_DEV__) { // remove strict-dynamic in dev... // TODO reinstate this if we can figure out how to make strict-dynamic work @@ -70,28 +91,34 @@ class BaseProvider { // if (d['script-src'].length === 0) delete d['script-src']; // } - const effective_style_src = d['style-src'] || d['default-src']; - // ...and add unsafe-inline so we can inject