| A01 | Broken Access Control | Missing auth, IDOR, path traversal | Auth middleware, ownership check |
| A02 | Cryptographic Failures | password: 'plaintext' | bcrypt/argon2 hashing |
| A03 | Injection | db.query(\SELECT...${id}`)` | Parameterized query, ORM |
| A03 | Injection | exec(\ping ${host}`)` | Input validation, library instead |
| A03 | XSS | dangerouslySetInnerHTML (static presence) | Default escaping, DOMPurify |
| A05 | Security Misconfiguration | cors({ origin: '*' }) | Explicit origin allowlist |
| A05 | Security Misconfiguration | cookie: {} with no options | secure, httpOnly, sameSite: 'strict' |
| A05 | Security Misconfiguration | err.stack in error response without NODE_ENV guard | Generic message in prod, log internally |
| A09 | Logging Failures | logger.info({ password }) | Exclude sensitive fields |
| A10 | SSRF | fetch(userInputUrl) | URL validation, allowlist |
| A07 | Authentication Failures | No rate limit on auth endpoints (login, register, password-reset) | Rate limiter middleware on auth route group |
| A01 | CSRF | No CSRF token verification on state-changing requests (POST/PUT/PATCH/DELETE) | Double Submit Cookie |
| A02 | Timing Attack | === comparison of tokens/signatures | Constant-time comparison: XOR all bytes, decide last |
| A08 | Prototype Pollution | Request object built with ...body spread | Explicit field assignment |
| A03 | XSS (Taint) | dangerouslySetInnerHTML={{ __html }} without sanitizer | DOMPurify.sanitize() at boundary |
| A03 | XSS (Taint) | Function arg → innerHTML without sanitization | Sanitize at function boundary |
| A03 | XSS (Taint) | <a href={variable}> with user-controlled URL | Protocol allowlist of https/http only |
| A01 | Open Redirect (Taint) | URL param → location.href without validation | Domain allowlist or relative-only |
| A04 | Insecure Design | postMessage handler without origin check | Strict event.origin comparison |
| A02 | Sensitive Data Exposure | JWT stored in localStorage/sessionStorage | httpOnly cookie instead |
| LLM01 | Prompt Injection (LLM) | Untrusted or caller-controlled value such as RAG docs, fetched content, tool results, or role args reaches the prompt with no data-only framing | Delimit untrusted content as data; map caller values to fixed enumerated instructions |