feat: add helmet middleware for security and implement Content Security Policy in Next.js configuration

This commit is contained in:
Nils-Johan Gynther
2026-04-21 07:44:04 +02:00
parent eb7adda612
commit c1d51c771e
3 changed files with 50 additions and 1 deletions
+2 -1
View File
@@ -30,7 +30,8 @@
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"sharp": "^0.33.5", "sharp": "^0.33.5",
"tesseract.js": "^6.0.1", "tesseract.js": "^6.0.1",
"uuid": "^11.1.0" "uuid": "^11.1.0",
"helmet": "^8.0.0"
}, },
"devDependencies": { "devDependencies": {
"@nestjs/cli": "^10.3.0", "@nestjs/cli": "^10.3.0",
+21
View File
@@ -2,10 +2,31 @@ import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core'; import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { GlobalExceptionFilter } from './common/filters/global-exception.filter'; import { GlobalExceptionFilter } from './common/filters/global-exception.filter';
import helmet from 'helmet';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
// Helmet som säkerhetsbackup (CSP hanteras av Next.js/Caddy)
app.use(
helmet({
contentSecurityPolicy: false,
crossOriginEmbedderPolicy: true,
crossOriginOpenerPolicy: { policy: 'same-origin' },
crossOriginResourcePolicy: { policy: 'same-origin' },
originAgentCluster: true,
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
strictTransportSecurity: {
maxAge: 31536000,
includeSubDomains: true,
preload: true,
},
xContentTypeOptions: true,
xFrameOptions: { action: 'deny' },
xXssProtection: false, // Deprecated, hanteras av Caddy
}),
);
app.setGlobalPrefix('api'); app.setGlobalPrefix('api');
// Registrera global exception filter // Registrera global exception filter
+27
View File
@@ -9,6 +9,33 @@ const nextConfig = {
}, },
]; ];
}, },
async headers() {
const csp = [
"default-src 'self'",
"script-src 'self' 'unsafe-eval' 'unsafe-inline'",
"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com",
"img-src 'self' data: https:",
"font-src 'self' https://fonts.gstatic.com",
"connect-src 'self' https://api.mistral.ai",
"frame-src 'none'",
"object-src 'none'",
"base-uri 'self'",
"form-action 'self'",
"upgrade-insecure-requests",
].join('; ');
return [
{
source: '/:path*',
headers: [
{
key: 'Content-Security-Policy',
value: csp,
},
],
},
];
},
}; };
module.exports = nextConfig; module.exports = nextConfig;