UNPKG

nestjs-security-module

Version:

A plug-and-play NestJS security module with CORS, Helmet, rate limiting, audit logging, CSP, XSS sanitization, and more.

133 lines 5.54 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var SecurityModule_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.SecurityModule = void 0; const common_1 = require("@nestjs/common"); const helmet_1 = require("helmet"); const audit_log_middleware_1 = require("./middlewares/audit-log.middleware"); const rate_limit_middleware_1 = require("./middlewares/rate-limit.middleware"); let SecurityModule = class SecurityModule { static { SecurityModule_1 = this; } static options; static enableCors = false; static corsOptions = undefined; static sanitizeEnabled = false; static forRoot(options) { this.options = options; this.sanitizeEnabled = !!options.sanitize; const imports = []; const providers = []; return { module: SecurityModule_1, imports, providers, }; } static register(options) { this.options = options; this.sanitizeEnabled = !!options.sanitize; this.enableCors = !!options.cors; this.corsOptions = typeof options.cors === 'object' ? options.cors : undefined; return { module: SecurityModule_1, }; } configure(consumer) { const options = SecurityModule_1.options; if (options.helmet !== false) { consumer.apply((0, helmet_1.default)()).forRoutes('*'); } if (options.cors) { SecurityModule_1.enableCors = true; SecurityModule_1.corsOptions = typeof options.cors === 'object' ? options.cors : undefined; } if (options.rateLimit) { consumer .apply((0, rate_limit_middleware_1.createRateLimitMiddleware)(options.rateLimit)) .forRoutes('*'); } if (options.auditLog) { consumer.apply((0, audit_log_middleware_1.createAuditLogMiddleware)()).forRoutes('*'); } if (options.csp) { const cspConfig = typeof options.csp === 'object' ? options.csp : { useDefaults: true, directives: { 'default-src': ["'self'"], 'script-src': ["'self'"], 'style-src': ["'self'", "'unsafe-inline'"], 'img-src': ["'self'", 'data:'], }, }; consumer.apply(helmet_1.default.contentSecurityPolicy(cspConfig)).forRoutes('*'); } if (options.xFrameOptions) { const frameValue = typeof options.xFrameOptions === 'string' ? options.xFrameOptions.toLowerCase() : 'sameorigin'; consumer .apply(helmet_1.default.frameguard({ action: frameValue, })) .forRoutes('*'); } if (options.referrerPolicy) { const policy = typeof options.referrerPolicy === 'object' ? options.referrerPolicy : { policy: 'no-referrer' }; consumer.apply(helmet_1.default.referrerPolicy(policy)).forRoutes('*'); } if (options.hsts) { const hstsConfig = typeof options.hsts === 'object' ? options.hsts : { maxAge: 60 * 60 * 24 * 180 }; consumer.apply(helmet_1.default.hsts(hstsConfig)).forRoutes('*'); } if (options.xContentTypeOptions !== false) { consumer.apply(helmet_1.default.noSniff()).forRoutes('*'); } if (options.expectCt) { const expectCtConfig = typeof options.expectCt === 'object' ? options.expectCt : { maxAge: 86400, enforce: true }; consumer .apply((req, res, next) => { res.setHeader('Expect-CT', `max-age=${expectCtConfig.maxAge}${expectCtConfig.enforce ? ', enforce' : ''}`); next(); }) .forRoutes('*'); } if (options.permissionsPolicy) { const policy = Object.entries(options.permissionsPolicy) .map(([key, val]) => `${key}=(${val.join(' ')})`) .join(', '); consumer .apply((req, res, next) => { res.setHeader('Permissions-Policy', policy); next(); }) .forRoutes('*'); } if (options.crossOriginEmbedderPolicy !== false) { const coep = typeof options.crossOriginEmbedderPolicy === 'object' ? options.crossOriginEmbedderPolicy : {}; consumer.apply(helmet_1.default.crossOriginEmbedderPolicy(coep)).forRoutes('*'); } } }; exports.SecurityModule = SecurityModule; exports.SecurityModule = SecurityModule = SecurityModule_1 = __decorate([ (0, common_1.Module)({}) ], SecurityModule); //# sourceMappingURL=security.module.js.map