Problem Statement
Apps that enforce Trusted Types (Content-Security-Policy: require-trusted-types-for 'script') can't use several SDK features without a pass-through default policy, which disables Trusted Types for the whole page.
Repro: https://github.com/oioki/trusted-types-sentry-js-sdk. It's a minimal Vite + React app with @sentry/react 11.0.0 and no Trusted Types policies of its own, so every violation comes from the SDK.
| Sink |
Where |
Enforced result |
Workaround |
new Worker(url) |
Replay compression worker |
Caught; replay continues |
useCompression: false (larger payloads) |
innerHTML |
Feedback form (dangerouslySetInnerHTML: logo, success icon, screenshot styles) |
Form doesn't render |
showBranding: false covers the logo only |
script.src |
showReportDialog() |
Throws, no dialog |
None |
innerHTML |
error-page-embed.js (served by Sentry) |
Blocked once the dialog loads |
None |
script.src |
lazyLoadIntegration() |
Throws |
None |
script.src |
Loader Script |
Throws |
None |
The workaround in #15913 (workerUrl) doesn't help: new Worker(url) requires a TrustedScriptURL for any string URL, not just blob: URLs, so a self-hosted worker still violates.
Teams with a strict CSP (enterprise, fintech, public sector, Angular and Lit users) currently have to choose between Sentry's Replay, Feedback and User Feedback dialog and enforcing Trusted Types. Teams in report-only rollout also get SDK noise in their violation reports, with no policy name they can allow.
Solution Brainstorm
- The SDK creates one named policy, e.g.
sentry-sdk, that validates rather than passes values through. It would allow only script URLs the SDK builds itself (DSN host plus the known paths, the CDN) and only static HTML. Apps allow it with trusted-types sentry-sdk.
- Remove the
innerHTML uses in feedback by building the SVG and styles with DOM APIs.
- Document the CSP needed (
trusted-types sentry-sdk, and 'allow-duplicates' when more than one SDK copy is on the page).
Additional Context
#24738 is a first step: a shared sentry-sdk policy helper, used by showReportDialog.
Priority
React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it.
Problem Statement
Apps that enforce Trusted Types (
Content-Security-Policy: require-trusted-types-for 'script') can't use several SDK features without a pass-throughdefaultpolicy, which disables Trusted Types for the whole page.Repro: https://github.com/oioki/trusted-types-sentry-js-sdk. It's a minimal Vite + React app with
@sentry/react11.0.0 and no Trusted Types policies of its own, so every violation comes from the SDK.new Worker(url)useCompression: false(larger payloads)innerHTMLdangerouslySetInnerHTML: logo, success icon, screenshot styles)showBranding: falsecovers the logo onlyscript.srcshowReportDialog()innerHTMLerror-page-embed.js(served by Sentry)script.srclazyLoadIntegration()script.srcThe workaround in #15913 (
workerUrl) doesn't help:new Worker(url)requires aTrustedScriptURLfor any string URL, not justblob:URLs, so a self-hosted worker still violates.Teams with a strict CSP (enterprise, fintech, public sector, Angular and Lit users) currently have to choose between Sentry's Replay, Feedback and User Feedback dialog and enforcing Trusted Types. Teams in report-only rollout also get SDK noise in their violation reports, with no policy name they can allow.
Solution Brainstorm
sentry-sdk, that validates rather than passes values through. It would allow only script URLs the SDK builds itself (DSN host plus the known paths, the CDN) and only static HTML. Apps allow it withtrusted-types sentry-sdk.innerHTMLuses in feedback by building the SVG and styles with DOM APIs.trusted-types sentry-sdk, and'allow-duplicates'when more than one SDK copy is on the page).Additional Context
#24738 is a first step: a shared
sentry-sdkpolicy helper, used byshowReportDialog.Priority
React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding
+1orme too, to help us triage it.