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-securityRules (6)
Browse all NestJS security rules with CWE/OWASP mapping
Changelog
View version history and updates
Live from GitHub
This content is fetched directly from README.md on GitHub and cached for 1 hour.
⭐ 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
- To check out the guide, visit eslint.interlace.tools. 📚
npm install eslint-plugin-nestjs-security --save-dev⚙️ Configuration Presets
| Preset | Description |
|---|---|
recommended | Enables all security rules with sensible severity levels |
strict | All security rules set to 'error' for maximum protection |
📚 Supported Libraries
| Library | npm | Downloads | Detection |
|---|---|---|---|
@nestjs/common | Decorators, Guards | ||
@nestjs/core | App Config | ||
class-validator | DTO Validation | ||
@nestjs/throttler | Rate 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.
| Approach | Example | Detected? |
|---|---|---|
| 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-inWhere 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
| Package | Version |
|---|---|
| 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
| Icon | Description |
|---|---|
| 💼 | 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. |
| Rule | CWE | OWASP | CVSS | Description | 🧠 | 💼 | ⚠️ | 🔧 | 💡 | 🚫 |
|---|---|---|---|---|---|---|---|---|---|---|
| no-exposed-private-fields | CWE-200 | A01:2021 | This rule detects sensitive fields (like passwords, tokens, secrets) in entity or DTO classes that are not… | 🟢 | ⚠️ | |||||
| no-hybrid-app-config-loss | CWE-20 | A03:2021 | Detect connectMicroservice() without inheritAppConfig, which silently drops every global pipe and guard fro… | 🟢 | 💼 | |||||
| no-missing-validation-pipe | CWE-20 | A03:2021 | The rule provides LLM-optimized error messages (Compact 2-line format) with actionable security guidance: | 🟡 | ⚠️ | |||||
| no-permissive-cors | CWE-942 | A05:2021 | Flags CORS configured to accept any origin — a bare enableCors(), origin '*', or the reflecting origin true. | 🟢 | 💼 | |||||
| no-res-bypass-serialization | CWE-200 | A01:2021 | This rule detects route handlers that inject @Res() without passthrough and then write an object, which sil… | 🟢 | ⚠️ | |||||
| no-unguarded-swagger | CWE-200 | A01:2021 | This rule detects SwaggerModule.setup() running unconditionally in an application bootstrap, which publishe… | 🟢 | ⚠️ | |||||
| no-unsafe-multer-filename | CWE-22 | A01:2021 | Flags a multer diskStorage filename callback that stores an upload under the name the client chose. | 🟢 | 💼 | |||||
| require-guards | CWE-306 | A01:2021 | The rule provides LLM-optimized error messages (Compact 2-line format) with actionable security guidance: | 🟢 | 💼 | |||||
| require-throttler | CWE-770 | A05:2021 | This rule detects NestJS controllers and route handlers that lack rate limiting, which can make the applica… | 🟢 | ⚠️ | |||||
| require-validation-pipe-whitelist | CWE-915 | A03:2021 | Requires whitelist true on ValidationPipe, so properties the DTO never declared are stripped instead of rea… | 🟢 | 💼 |
🔗 Related ESLint Plugins
Part of the Interlace ESLint ecosystem — AI-native rules with LLM-optimized error messages:
Security
Code quality
| Plugin | Downloads | Description |
|---|---|---|
eslint-plugin-conventions | Team-specific habits and styles. | |
eslint-plugin-import-next | Fast cycle + import-graph analysis. | |
eslint-plugin-maintainability | Cognitive load and clean-code patterns. | |
eslint-plugin-modernization | ESNext migration + syntax evolution. | |
eslint-plugin-modularity | Structural integrity and DDD patterns. | |
eslint-plugin-operability | Production readiness and resource health. | |
eslint-plugin-react-a11y | React accessibility / WCAG. | |
eslint-plugin-react-features | React best practices and optimization. | |
eslint-plugin-reliability | Runtime 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.
📄 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.