diff --git a/server.js b/server.js index a08a5e6..e1b104b 100644 --- a/server.js +++ b/server.js @@ -30,6 +30,7 @@ const { MOCK_USERS, backUrl } = require('./src/config'); const { mutationLimiter, exportLimiter } = require('./src/middleware/rateLimit'); const { initCsrf } = require('./src/middleware/csrf'); const { createSessionMiddleware } = require('./src/middleware/session'); +const { cspMiddleware } = require('./src/middleware/csp'); const app = express(); const PORT = process.env.PORT || 3000; @@ -38,9 +39,9 @@ app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')); // ── Безопасность HTTP-заголовков ─────────────────────────────────────────────── -// helmet выставляет: X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, -// Referrer-Policy и пр. CSP отключён явно — EJS использует inline-стили/скрипты. +// helmet выставляет базовые заголовки; CSP вынесен в src/middleware/csp.js. app.use(helmet({ contentSecurityPolicy: false })); +app.use(cspMiddleware); // За reverse-proxy (nginx/k8s ingress) — доверяем первому хопу для secure cookies. if (process.env.NODE_ENV === 'production') app.set('trust proxy', 1); diff --git a/src/middleware/csp.js b/src/middleware/csp.js new file mode 100644 index 0000000..80bb467 --- /dev/null +++ b/src/middleware/csp.js @@ -0,0 +1,51 @@ +/** + * src/middleware/csp.js — Content Security Policy через helmet. + * + * Текущее ограничение: EJS-шаблоны используют inline