Przeglądaj źródła

Allow additional CSP directives to be defined for specific views (#19550)

GitOrigin-RevId: 19bf1004479b5106e64e9c13d58d69e328cc12f1
Alf Eaton 2 lat temu
rodzic
commit
c91d99de80

+ 14 - 2
services/web/app/src/infrastructure/CSP.js

@@ -6,6 +6,7 @@ module.exports = function ({
   reportPercentage,
   reportPercentage,
   reportOnly = false,
   reportOnly = false,
   exclude = [],
   exclude = [],
+  viewDirectives = {},
 }) {
 }) {
   const header = reportOnly
   const header = reportOnly
     ? 'Content-Security-Policy-Report-Only'
     ? 'Content-Security-Policy-Report-Only'
@@ -37,7 +38,12 @@ module.exports = function ({
 
 
         res.locals.scriptNonce = scriptNonce
         res.locals.scriptNonce = scriptNonce
 
 
-        const policy = buildViewPolicy(scriptNonce, reportPercentage, reportUri)
+        const policy = buildViewPolicy(
+          scriptNonce,
+          reportPercentage,
+          reportUri,
+          viewDirectives[view]
+        )
 
 
         // Note: https://csp-evaluator.withgoogle.com/ is useful for checking the policy
         // Note: https://csp-evaluator.withgoogle.com/ is useful for checking the policy
 
 
@@ -72,11 +78,17 @@ const buildDefaultPolicy = (reportUri, styleSrc) => {
   return directives.join('; ')
   return directives.join('; ')
 }
 }
 
 
-const buildViewPolicy = (scriptNonce, reportPercentage, reportUri) => {
+const buildViewPolicy = (
+  scriptNonce,
+  reportPercentage,
+  reportUri,
+  viewDirectives
+) => {
   const directives = [
   const directives = [
     `script-src 'nonce-${scriptNonce}' 'unsafe-inline' 'strict-dynamic' https: 'report-sample'`, // only allow scripts from certain sources
     `script-src 'nonce-${scriptNonce}' 'unsafe-inline' 'strict-dynamic' https: 'report-sample'`, // only allow scripts from certain sources
     `object-src 'none'`, // forbid loading an "object" element
     `object-src 'none'`, // forbid loading an "object" element
     `base-uri 'none'`, // forbid setting a "base" element
     `base-uri 'none'`, // forbid setting a "base" element
+    ...(viewDirectives ?? []),
   ]
   ]
 
 
   if (reportUri) {
   if (reportUri) {

+ 3 - 0
services/web/config/settings.defaults.js

@@ -977,6 +977,9 @@ module.exports = {
     reportPercentage: parseFloat(process.env.CSP_REPORT_PERCENTAGE) || 0,
     reportPercentage: parseFloat(process.env.CSP_REPORT_PERCENTAGE) || 0,
     reportUri: process.env.CSP_REPORT_URI,
     reportUri: process.env.CSP_REPORT_URI,
     exclude: [],
     exclude: [],
+    viewDirectives: {
+      'app/views/project/ide-react': [`img-src 'self' data: blob:`],
+    },
   },
   },
 
 
   unsupportedBrowsers: {
   unsupportedBrowsers: {