From 5e755fff9d70a7fd3c4f85bb524f1b774dd85b25 Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Thu, 13 Dec 2018 09:49:45 +0100 Subject: add Content Security Policy (#1252) * add Content Security Policy * remove reflect-metadata on production builds to get rid of unsafe-eval * fix baseCSP usage * add SRI to CSP * add blob: to media-src * remove SRI * CSP set to reportOnly * adding data: to connect-src CSP * remove block-all-mixed-content * add report-uri support --- server/middlewares/csp.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ server/middlewares/dnt.ts | 2 +- server/middlewares/index.ts | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 server/middlewares/csp.ts (limited to 'server/middlewares') diff --git a/server/middlewares/csp.ts b/server/middlewares/csp.ts new file mode 100644 index 000000000..a0ed3710b --- /dev/null +++ b/server/middlewares/csp.ts @@ -0,0 +1,45 @@ +import * as helmet from 'helmet' +import { CONFIG } from '../initializers/constants' + +const baseDirectives = Object.assign({}, + { + defaultSrc: ["'none'"], // by default, not specifying default-src = '*' + connectSrc: ['*', 'data:'], + mediaSrc: ["'self'", 'https:', 'blob:'], + fontSrc: ["'self'", 'data:'], + imgSrc: ["'self'", 'data:'], + scriptSrc: ["'self' 'unsafe-inline'"], + styleSrc: ["'self' 'unsafe-inline'"], + // objectSrc: ["'none'"], // only define to allow plugins, else let defaultSrc 'none' block it + formAction: ["'self'"], + frameAncestors: ["'none'"], + baseUri: ["'self'"], + pluginTypes: ["'none'"], + manifestSrc: ["'self'"], + frameSrc: ["'self'"], // instead of deprecated child-src / self because of test-embed + workerSrc: ["'self'"], // instead of deprecated child-src + upgradeInsecureRequests: true + }, + (CONFIG.SERVICES['CSP-LOGGER'] != null) ? { reportUri: CONFIG.SERVICES['CSP-LOGGER'] } : {} +) + +const baseCSP = helmet.contentSecurityPolicy({ + directives: baseDirectives, + browserSniff: false, + reportOnly: true +}) + +const embedCSP = helmet.contentSecurityPolicy({ + directives: Object.assign(baseDirectives, { + frameAncestors: ['*'] + }), + browserSniff: false, // assumes a modern browser, but allows CDN in front + reportOnly: true +}) + +// --------------------------------------------------------------------------- + +export { + baseCSP, + embedCSP +} diff --git a/server/middlewares/dnt.ts b/server/middlewares/dnt.ts index cabad39c6..607def855 100644 --- a/server/middlewares/dnt.ts +++ b/server/middlewares/dnt.ts @@ -10,4 +10,4 @@ const advertiseDoNotTrack = (_, res, next) => { export { advertiseDoNotTrack - } +} diff --git a/server/middlewares/index.ts b/server/middlewares/index.ts index 0cef26953..b758a8586 100644 --- a/server/middlewares/index.ts +++ b/server/middlewares/index.ts @@ -6,3 +6,5 @@ export * from './pagination' export * from './servers' export * from './sort' export * from './user-right' +export * from './dnt' +export * from './csp' -- cgit v1.2.3