Skip to main content
interlace
Plugin: nestjs-security

eslint-plugin-nestjs-security

NestJS security rules for guards, validation pipes, throttling, and more

AI-Optimized Security

Every rule includes CWE, OWASP, and CVSS metadata for AI assistants to provide precise, context-aware fixes.

Install

npm install -D eslint-plugin-nestjs-security

Live from GitHub

This content is fetched directly from README.md on GitHub and cached for 1 hour.

Live README from GitHubfrom eslint-plugin-nestjs-security/README.md, cached for 1 hour.Edit on GitHub

⭐ If this plugin caught a real bug for you, star the repo — it's the signal that keeps these rules maintained.

Description

This plugin provides Security rules tailored for NestJS applications (Controllers, Providers, Decorators).

  • Why — a linter nobody reads protects nothing. We would rather miss a finding than spend your attention on one that was never real.
  • How — evidence, not names. A rule fires on what the code does, resolved through the AST and ESLint's own scope analysis.
  • What — every finding carries its fix, in prose for a human and as structured JSON for an agent. Security rules add a CWE mapping and, where assigned, a CVSS score.

That trade costs recall, and we measure it: methodology · results · a false positive is a bug.

Getting Started

npm install eslint-plugin-nestjs-security --save-dev

⚙️ Configuration Presets

PresetDescription
recommendedEnables all security rules with sensible severity levels
strictAll security rules set to 'error' for maximum protection

📚 Supported Libraries

LibrarynpmDownloadsDetection
@nestjs/commonnpmdownloadsDecorators, Guards
@nestjs/corenpmdownloadsApp Config
class-validatornpmdownloadsDTO Validation
@nestjs/throttlernpmdownloadsRate Limiting

⚠️ Global Configuration Handling

NestJS applies guards, pipes and rate limiting application-wide, in a file the controller never imports. Since v1.3.0 the plugin discovers those registrations itself: on the first finding it locates the project root (nearest package.json) and scans the bootstrap and *.module.ts files once, caching the result.

ApproachExampleDetected?
Per-Controller@UseGuards(AuthGuard) on class
Per-Method@UseGuards(AuthGuard) on method
Composite@AuthJwtAccessProtected() wrapping UseGuards✅¹
Global (main.ts)app.useGlobalGuards() / app.useGlobalPipes()
Global (Module){ provide: APP_GUARD, useClass: AuthGuard }
Global (Module){ provide: APP_PIPE, useClass: ValidationPipe }
Global (Module)ThrottlerModule.forRoot([{ ttl: 60000, limit: 10 }])

¹ A composite decorator cannot be resolved by a syntax-only linter, so any route carrying a decorator the plugin does not recognise is assumed to be protected. A missed finding is cheaper than a false positive on somebody else's codebase. Set allowCustomDecorators: false on require-guards if you want the strict behaviour back.

ThrottlerGuard registered as APP_GUARD counts as rate limiting, not as authentication — a project that only throttles still gets require-guards findings.

Escape hatch: assumeGlobal* and detectGlobal* options

assumeGlobal*: true disables a rule outright without scanning the project; detectGlobal*: false disables the project scan and restores strict per-file checking:

// eslint.config.js
import nestjsSecurity from 'eslint-plugin-nestjs-security';

export default [
  {
    ...nestjsSecurity.configs.recommended,
    rules: {
      // Tell ESLint: "We have app.useGlobalGuards() in main.ts"
      'nestjs-security/require-guards': ['warn', { assumeGlobalGuards: true }],

      // Tell ESLint: "We have app.useGlobalPipes(new ValidationPipe()) in main.ts"
      'nestjs-security/no-missing-validation-pipe': [
        'warn',
        { assumeGlobalPipes: true },
      ],

      // Tell ESLint: "We have ThrottlerModule.forRoot() in app.module.ts"
      'nestjs-security/require-throttler': [
        'warn',
        { assumeGlobalThrottler: true },
      ],

      // Or keep strict per-file checking and skip the project scan entirely
      // 'nestjs-security/require-guards': ['error', { detectGlobalGuards: false }],
    },
  },
];

Alternative: Use Skip Decorators

The rules recognize common "bypass" decorators for intentionally unprotected endpoints:

// These bypass require-guards
@Public()        // nestjs-passport pattern
@SkipAuth()      // common custom decorator
@AllowAnonymous() // alternative naming
@NoAuth()        // alternative naming

// These bypass require-throttler
@SkipThrottle()  // @nestjs/throttler built-in

Where rate limiting is reported

require-throttler reports once, on the root module (AppModule, or any @Module class in app.module.ts) when no ThrottlerModule is configured anywhere in the project. Rate limiting is adopted with one module registration, so reporting it on every route described a one-line fix as dozens of errors.


📦 Compatibility

PackageVersion
ESLint^8.40.0 || ^9.0.0 || ^10.0.0
Node.js>=18.0.0

See the ESLint Version Support Policy — current ecosystem share data, the 20% gate, and the forward-looking exception that covers v10.

Rules

Legend

IconDescription
💼Recommended: Included in the recommended preset.
⚠️Warns: Set to warn in recommended preset.
🔧Auto-fixable: Automatically fixable by the --fix CLI option.
💡Suggestions: Providing code suggestions in IDE.
🚫Deprecated: This rule is deprecated.
🟢Type-unaware: AST-only, runs in oxlint JS-plugin tier.
🟡Type-aware (refining): pure-AST primary path; types refine precision.
🟠Type-aware (graceful): requires TS program; silent without it.
RuleCWEOWASPCVSSDescription🧠💼⚠️🔧💡🚫
no-exposed-private-fieldsCWE-200A01:2021This rule detects sensitive fields (like passwords, tokens, secrets) in entity or DTO classes that are not…🟢⚠️
no-hybrid-app-config-lossCWE-20A03:2021Detect connectMicroservice() without inheritAppConfig, which silently drops every global pipe and guard fro…🟢💼
no-missing-validation-pipeCWE-20A03:2021The rule provides LLM-optimized error messages (Compact 2-line format) with actionable security guidance:🟡⚠️
no-permissive-corsCWE-942A05:2021Flags CORS configured to accept any origin — a bare enableCors(), origin '*', or the reflecting origin true.🟢💼
no-res-bypass-serializationCWE-200A01:2021This rule detects route handlers that inject @Res() without passthrough and then write an object, which sil…🟢⚠️
no-unguarded-swaggerCWE-200A01:2021This rule detects SwaggerModule.setup() running unconditionally in an application bootstrap, which publishe…🟢⚠️
no-unsafe-multer-filenameCWE-22A01:2021Flags a multer diskStorage filename callback that stores an upload under the name the client chose.🟢💼
require-guardsCWE-306A01:2021The rule provides LLM-optimized error messages (Compact 2-line format) with actionable security guidance:🟢💼
require-throttlerCWE-770A05:2021This rule detects NestJS controllers and route handlers that lack rate limiting, which can make the applica…🟢⚠️
require-validation-pipe-whitelistCWE-915A03:2021Requires whitelist true on ValidationPipe, so properties the DTO never declared are stripped instead of rea…🟢💼

Part of the Interlace ESLint ecosystem — AI-native rules with LLM-optimized error messages:

Security

PluginDownloadsDescription
eslint-plugin-anthropic-securitydownloadsAnthropic SDK security.
eslint-plugin-browser-securitydownloadsXSS, DOM security.
eslint-plugin-drizzle-securitydownloadsDrizzle security.
eslint-plugin-express-securitydownloadsExpress middleware hardening.
eslint-plugin-gemini-securitydownloadsGoogle Gemini SDK security.
eslint-plugin-jwt-securitydownloadsToken security.
eslint-plugin-knex-securitydownloadsKnex security.
eslint-plugin-lambda-securitydownloadsAWS Lambda hardening.
eslint-plugin-mcp-sdk-securitydownloadsMCP SDK security.
eslint-plugin-mongodb-securitydownloadsMongoDB injection.
eslint-plugin-mysql-securitydownloadsMySQL security.
eslint-plugin-node-securitydownloadsServer-side patterns.
eslint-plugin-openai-securitydownloadsOpenAI SDK security.
eslint-plugin-postgresql-securitydownloadsPostgreSQL security.
eslint-plugin-prisma-securitydownloadsPrisma security.
eslint-plugin-secure-codingdownloadsInjection prevention.
eslint-plugin-sequelize-securitydownloadsSequelize ORM security.
eslint-plugin-sqlite-securitydownloadsSQLite security.
eslint-plugin-supabase-securitydownloadsSupabase security.
eslint-plugin-typeorm-securitydownloadsTypeORM security.
eslint-plugin-vercel-ai-securitydownloadsAI SDK security.

Code quality

PluginDownloadsDescription
eslint-plugin-conventionsdownloadsTeam-specific habits and styles.
eslint-plugin-import-nextdownloadsFast cycle + import-graph analysis.
eslint-plugin-maintainabilitydownloadsCognitive load and clean-code patterns.
eslint-plugin-modernizationdownloadsESNext migration + syntax evolution.
eslint-plugin-modularitydownloadsStructural integrity and DDD patterns.
eslint-plugin-operabilitydownloadsProduction readiness and resource health.
eslint-plugin-react-a11ydownloadsReact accessibility / WCAG.
eslint-plugin-react-featuresdownloadsReact best practices and optimization.
eslint-plugin-reliabilitydownloadsRuntime stability and error safety.

⭐ Support & follow

If this plugin caught a real bug for you, star the repo — stars are the signal that keeps the Interlace ESLint ecosystem maintained — and follow the writeups on Dev.to for the benchmarks and security research behind these rules.

GitHub stars

📄 License

MIT © Ofri Peretz

View README.md on GitHub →

Building secure JavaScript with Interlace? Star the repo to get new rules and CWE coverage as we ship them — or follow the AI-code-security benchmarks behind them.