DEV Community

Cover image for Mapping Your Codebase to OWASP Top 10 with 247 ESLint Rules
Ofri Peretz
Ofri Peretz

Posted on • Edited on

Mapping Your Codebase to OWASP Top 10 with 247 ESLint Rules

Your security audit asks: "How do you address OWASP Top 10?"

Here's how to answer with automated evidence using 247 rules across 10 specialized ESLint plugins.

The Multi-Plugin Approach

One plugin can't cover everything. SQL injection needs database-aware rules. JWT attacks need token-specific detection. Here's the complete mapping:

OWASP Top 10 2021 β†’ Plugin Coverage

# Category Risk Plugins Key Rules
A01 Broken Access Control High secure-coding, nestjs-security, lambda-security no-privilege-escalation, require-guards, no-missing-authorization-check
A02 Cryptographic Failures High crypto, pg, jwt no-weak-hash-algorithm, no-hardcoded-credentials, no-weak-secret
A03 Injection Critical secure-coding, pg, browser-security detect-eval-with-expression, no-unsafe-query, no-innerhtml
A04 Insecure Design Medium secure-coding, nestjs-security no-improper-type-validation, no-missing-validation-pipe
A05 Security Misconfiguration High express-security, lambda-security require-helmet, no-permissive-cors, no-exposed-error-details
A06 Vulnerable Components Medium secure-coding, import-next detect-suspicious-dependencies, no-extraneous-dependencies
A07 Auth Failures High jwt, express-security no-algorithm-none, no-algorithm-confusion, no-insecure-cookie-options
A08 Integrity Failures Medium secure-coding no-unsafe-deserialization, no-unsafe-dynamic-require
A09 Logging Failures Medium secure-coding, lambda-security no-pii-in-logs, no-error-swallowing
A10 SSRF High secure-coding, lambda-security, vercel-ai-security require-url-validation, no-user-controlled-requests

Quick Install: Full OWASP Coverage

# Core Security (75 rules)
npm install -D eslint-plugin-secure-coding

# Specialized Security
npm install -D eslint-plugin-crypto         # 24 crypto rules
npm install -D eslint-plugin-jwt            # 13 JWT rules
npm install -D eslint-plugin-pg             # 13 PostgreSQL rules

# Browser Security
npm install -D eslint-plugin-browser-security  # 21 DOM/XSS rules

# Framework-Specific (choose yours)
npm install -D eslint-plugin-express-security  # Express.js
npm install -D eslint-plugin-nestjs-security   # NestJS
npm install -D eslint-plugin-lambda-security   # AWS Lambda
Enter fullscreen mode Exit fullscreen mode

The Complete Config

// eslint.config.js - Full OWASP Top 10 Coverage
import secureCoding from 'eslint-plugin-secure-coding';
import crypto from 'eslint-plugin-crypto';
import jwt from 'eslint-plugin-jwt';
import pg from 'eslint-plugin-pg';
import browserSecurity from 'eslint-plugin-browser-security';
import expressSecurity from 'eslint-plugin-express-security';

export default [
  // Core OWASP preset (A01-A10 general coverage)
  secureCoding.configs['owasp-top-10'],

  // A02: Cryptographic Failures - specialized detection
  crypto.configs.recommended,

  // A07: Authentication Failures - JWT-specific
  jwt.configs.recommended,

  // A03: Injection - PostgreSQL-specific SQL injection
  {
    files: ['**/db/**', '**/repositories/**', '**/models/**'],
    ...pg.configs.recommended,
  },

  // A03: Injection - DOM XSS for frontend
  {
    files: ['**/components/**', '**/pages/**', 'src/**/*.tsx'],
    ...browserSecurity.configs.recommended,
  },

  // A05: Security Misconfiguration - Express-specific
  {
    files: ['**/routes/**', '**/middleware/**', 'app.ts', 'server.ts'],
    ...expressSecurity.configs.recommended,
  },
];
Enter fullscreen mode Exit fullscreen mode

Example Output

src/db/users.ts
  42:15  error  πŸ”’ CWE-89 OWASP:A03 | SQL Injection detected
                [pg/no-unsafe-query] Use parameterized query: client.query($1, [id])

src/auth/jwt.ts
  18:3   error  πŸ”’ CWE-347 OWASP:A07 | Algorithm confusion vulnerability
                [jwt/no-algorithm-confusion] Specify algorithms: { algorithms: ['RS256'] }

src/api/crypto.ts
  55:10  error  πŸ”’ CWE-328 OWASP:A02 | Weak hash algorithm: MD5
                [crypto/no-weak-hash-algorithm] Use SHA-256 or SHA-3

src/components/Comment.tsx
  12:5   error  πŸ”’ CWE-79 OWASP:A03 | XSS via innerHTML
                [browser-security/no-innerhtml] Use textContent or sanitize with DOMPurify
Enter fullscreen mode Exit fullscreen mode

A03 Injection: Multi-Layer Protection

Injection is #1 for a reason. Here's complete coverage:

Attack Vector Plugin Rule
SQL Injection (PostgreSQL) pg no-unsafe-query
SQL Injection (general) secure-coding detect-eval-with-expression
Command Injection secure-coding detect-child-process
LDAP Injection secure-coding no-ldap-injection
XPath Injection secure-coding no-xpath-injection
XXE Injection secure-coding no-xxe-injection
DOM XSS browser-security no-innerhtml, no-eval
Prompt Injection vercel-ai-security require-validated-prompt

A02 Cryptographic Failures: 24 Specialized Rules

// crypto plugin catches what generic plugins miss
import crypto from 'eslint-plugin-crypto';

// Detects:
// - CVE-2023-46809 (Marvin Attack) via no-insecure-rsa-padding
// - CVE-2020-36732 (CryptoJS) via no-cryptojs-weak-random
// - Weak algorithms: MD5, SHA1, DES, RC4, Blowfish
// - Static IVs, ECB mode, predictable salts
Enter fullscreen mode Exit fullscreen mode

A07 Auth Failures: JWT-Specific Detection

// jwt plugin catches token-specific vulnerabilities
import jwt from 'eslint-plugin-jwt';

// Detects:
// - Algorithm "none" attack
// - Algorithm confusion (CVE-2022-23540)
// - jwt.decode() without verify
// - Weak/hardcoded secrets
// - Missing expiration
Enter fullscreen mode Exit fullscreen mode

For OWASP Mobile Top 10

import secureCoding from 'eslint-plugin-secure-coding';

export default [
  {
    files: ['apps/mobile/**', '**/*.native.ts'],
    ...secureCoding.configs['owasp-mobile-top-10'],
  },
];
Enter fullscreen mode Exit fullscreen mode

Covers all 10 mobile categories:

# Category Rules
M1 Improper Credential Usage require-secure-credential-storage
M2 Inadequate Supply Chain detect-suspicious-dependencies, require-package-lock
M3 Insecure Auth no-client-side-auth-logic, require-backend-authorization
M4 Insufficient I/O Validation no-unvalidated-user-input, no-unvalidated-deeplinks
M5 Insecure Communication no-http-urls, require-https-only, no-allow-arbitrary-loads
M6 Inadequate Privacy no-pii-in-logs, no-tracking-without-consent
M7 Binary Protection require-code-minification
M8 Security Misconfiguration require-secure-defaults, no-verbose-error-messages
M9 Insecure Data Storage require-storage-encryption, no-data-in-temp-storage
M10 Insufficient Crypto Use eslint-plugin-crypto

For OWASP LLM Top 10

Building AI applications? Add the Vercel AI Security plugin:

import vercelAI from 'eslint-plugin-vercel-ai-security';

export default [
  {
    files: ['**/ai/**', '**/agents/**'],
    ...vercelAI.configs.recommended,
  },
];
Enter fullscreen mode Exit fullscreen mode

100% OWASP LLM Top 10 2024 coverage with 19 rules.

Getting Audit Evidence

Run ESLint with JSON output:

npx eslint . --format json > security-report.json
Enter fullscreen mode Exit fullscreen mode

Parse for OWASP tags:

const report = require('./security-report.json');

const owaspFindings = report
  .flatMap((file) => file.messages)
  .filter((msg) => msg.message.includes('OWASP:'));

// Group by OWASP category
const byCategory = owaspFindings.reduce((acc, finding) => {
  const match = finding.message.match(/OWASP:(A\d+)/);
  if (match) {
    acc[match[1]] = (acc[match[1]] || 0) + 1;
  }
  return acc;
}, {});

console.log('OWASP Coverage Report:', byCategory);
Enter fullscreen mode Exit fullscreen mode

Rule Count Summary

Plugin Rules Focus
eslint-plugin-secure-coding 75 Core OWASP coverage
eslint-plugin-crypto 24 Cryptography
eslint-plugin-jwt 13 JWT/Authentication
eslint-plugin-pg 13 PostgreSQL
eslint-plugin-browser-security 21 Browser/DOM
eslint-plugin-vercel-ai-security 19 AI/LLM
eslint-plugin-express-security 9 Express.js
eslint-plugin-lambda-security 13 AWS Lambda
eslint-plugin-nestjs-security 5 NestJS
eslint-plugin-import-next 55 Import/Dependencies
Total 247

Turn compliance questions into automated answers.


πŸ“¦ All Plugins:

⭐ Star on GitHub β€” 10 plugins, 247 rules


πŸš€ What's your biggest OWASP compliance gap? Drop a comment!

GitHub | LinkedIn


Copyright (c) 2025 Ofri Peretz. All rights reserved.

Top comments (0)