Insights

We design for
what could go wrong

Forty-nine classes of weakness we track and defend against, and the layers that close them. Not an audit we run at the end — the way we write code from the first commit.

49 weakness classes tracked
Three layers of defense
Mapped to OWASP Top 10

Security is cheaper than the breach.

Every line below is a real failure we've seen in products we inherited. None of them are hypothetical.

A user finds every customer's data by changing a number in the URL.
Your database gets dropped because a search box accepted a semicolon.
An attacker logs in as your admin. No password, no MFA, no alarm.
A script on another site quietly submits forms on behalf of your users.
Your API keys are sitting in a public repo. They've been there for months.
A file upload lets someone drop an executable on your server.
You find out about the breach from a reporter, not your monitoring.
The security audit happens after launch. The holes are already in production.

Security isn't a phase you add at the end. It's a property of how you write code — or it isn't a property at all. A pentest on the day before launch tells you what's broken. It doesn't give you time to fix it.

Three layers, working together.

No single control has to be perfect. That's the point of defense in depth — if one layer fails, the next one catches it.

01

Application & Web Security

The outer wall. Controls that sit between your software and the traffic trying to reach it.

Firewall
Content Security Policy
DDoS Protection
Pentest
Bot Protection
Captcha
Clickjacking Protection
Rate Limiting
Security Headers
02

Authentication & Access Control

The gates. Who gets in, what they can touch, and how hard it is to pretend to be someone else.

RBAC
Sessions & Token Management
SSO
IAM
Passkey
Password Security
MFA
OAuth / OIDC
03

Data Protection & Encryption

The vault. Even if someone gets through, the data they find is useless without the keys.

Data Backups
Pseudonymization
AES-256-GCM Encryption
SSL / HTTPS
Secret Manager
Key Rotation

Defense, in code.

The patterns we apply on every project, on every stack. None of them are exotic — most attacks are stopped by the boring disciplines, not the clever ones.

Parameterized queries

Every database call uses prepared statements. No string concatenation, no exceptions, no "just this once."

Output encoding

Data is encoded for the context it lands in — HTML, attribute, JavaScript, URL. Different rules for each.

Input validation & sanitization

Validate on entry, encode on output. Both sides of the boundary, every field, every time.

Content Security Policy

A strict CSP blocks inline scripts and limits resource origins. XSS defense at the browser level.

HttpOnly, Secure, SameSite cookies

Session cookies can't be read by JavaScript, travel only over TLS, and stay on the originating site — killing most CSRF.

RBAC at the boundary

Every route and API endpoint checks authorization, not just authentication. The framework never assumes it.

Allowlist file uploads

Uploads accept only approved types and storage sits outside the web root. The file can never execute.

Secret manager

Secrets live in environment variables or a vault. Never in code, never in repos, never in client-side bundles.

Dependency scanning in CI

Every build checks dependencies against the CVE database. A critical CVE blocks the pipeline until fixed.

Rate limiting

Auth and API endpoints cap requests per IP and per user. Brute force and scraping stop being free.

Security headers

HSTS, X-Frame-Options, X-Content-Type-Options set by default. The browser becomes part of the defense.

Structured logging without secrets

Logs capture what happened — request IDs, user IDs, event types. Never credentials, never PII.

The forty-nine we design against.

Grouped by what they attack, rated by severity and exploit complexity. We track them by CWE identifiers — the same catalog OWASP draws from.

Injection & code execution
CWECWE-79WeaknessCross-site scriptingXSS, HTML injectionWhat it doesInjecting scripts into pages to steal or manipulate data.SeverityCriticalExploit complexityModerate
CWECWE-787WeaknessOut-of-bounds writeMemory corruptionWhat it doesWriting data to memory locations it doesn't own.SeverityCriticalExploit complexityDifficult
CWECWE-89WeaknessSQL injectionSQLiWhat it doesManipulating database queries to access or destroy data.SeverityCriticalExploit complexityModerate
CWECWE-352WeaknessCSRFSession ridingWhat it doesTricking authenticated users into actions they didn't intend.SeverityCriticalExploit complexityModerate
CWECWE-78WeaknessOS command injectionShell injectionWhat it doesRunning unauthorized system commands through the app.SeverityCriticalExploit complexityModerate
CWECWE-94WeaknessCode injectionImproper code generationWhat it doesInjecting code to change application behavior.SeverityCriticalExploit complexityModerate
CWECWE-77WeaknessCommand injectionSpecial element injectionWhat it doesInjecting commands to control the host system.SeverityCriticalExploit complexityModerate
CWECWE-918WeaknessSSRFServer-side request forgeryWhat it doesTricking the server into making requests to internal resources.SeverityCriticalExploit complexityDifficult
CWECWE-611WeaknessXML external entityXXEWhat it doesProcessing XML with external entity references that read files or hit internal services.SeverityHighExploit complexityModerate
CWECWE-90WeaknessLDAP injectionLDAPiWhat it doesManipulating LDAP queries through unchecked user input.SeverityHighExploit complexityModerate
CWECWE-643WeaknessXPath injectionXPathiWhat it doesInjecting XPath to manipulate XML data access.SeverityMediumExploit complexityModerate
CWECWE-1336WeaknessServer-side template injectionSSTIWhat it doesInjecting template directives that run server-side code.SeverityCriticalExploit complexityModerate
Access control
CWECWE-862WeaknessMissing authorizationAuthZWhat it doesLetting users reach resources they shouldn't.SeverityCriticalExploit complexityModerate
CWECWE-287WeaknessImproper authenticationAuthNWhat it doesWeak or missing identity checks at the login door.SeverityCriticalExploit complexityModerate
CWECWE-269WeaknessImproper privilege managementWhat it doesGiving users more power than their role requires.SeverityCriticalExploit complexityModerate
CWECWE-863WeaknessIncorrect authorizationAuthZWhat it doesAllowing access without the right checks in place.SeverityCriticalExploit complexitySimple
CWECWE-639WeaknessInsecure direct object referenceIDORWhat it doesLetting users reach other users' data by changing an ID in the URL.SeverityCriticalExploit complexitySimple
CWECWE-732WeaknessPrivilege escalationVertical / horizontalWhat it doesGaining higher privileges than the role grants.SeverityCriticalExploit complexityModerate
CWECWE-306WeaknessMissing auth for critical functionWhat it doesNo identity check on an action that demands one.SeverityCriticalExploit complexitySimple
CWECWE-384WeaknessSession fixationWhat it doesForcing a user's session ID to impersonate them.SeverityHighExploit complexityModerate
Input & file handling
CWECWE-22WeaknessPath traversalDirectory traversalWhat it doesAccessing files outside the allowed directories.SeverityCriticalExploit complexityModerate
CWECWE-434WeaknessUnrestricted file uploadDangerous file typeWhat it doesAccepting files that carry malware or executable code.SeverityCriticalExploit complexityModerate
CWECWE-20WeaknessImproper input validationWhat it doesNot checking incoming data for harmful content.SeverityCriticalExploit complexitySimple
CWECWE-502WeaknessDeserialization of untrusted dataUnmarshaling, unpicklingWhat it doesProcessing untrusted serialized data, leading to remote code execution.SeverityCriticalExploit complexityDifficult
CWECWE-601WeaknessOpen redirectUnvalidated redirectWhat it doesRedirecting users to attacker-controlled URLs via a parameter.SeverityMediumExploit complexitySimple
Memory safety
CWECWE-125WeaknessOut-of-bounds readOOB readWhat it doesReading memory that should be off-limits.SeverityCriticalExploit complexityModerate
CWECWE-416WeaknessUse after freeDangling pointerWhat it doesAccessing memory after it's been released.SeverityCriticalExploit complexityDifficult
CWECWE-120WeaknessBuffer overflowWhat it doesWriting past the end of a buffer, overwriting adjacent memory.SeverityCriticalExploit complexityDifficult
CWECWE-190WeaknessInteger overflow / underflowWhat it doesArithmetic results exceeding the type's range, leading to logic errors.SeverityHighExploit complexityModerate
Data exposure & leakage
CWECWE-200WeaknessInformation disclosureInformation leakWhat it doesExposing sensitive data to users who shouldn't see it.SeverityCriticalExploit complexitySimple
CWECWE-312WeaknessSensitive data exposurePlaintext storageWhat it doesStoring passwords, tokens, or PII without encryption or hashing.SeverityCriticalExploit complexitySimple
CWECWE-524WeaknessCache exposes sensitive dataWhat it doesCached responses containing credentials or personal data.SeverityHighExploit complexitySimple
CWECWE-598WeaknessInformation in query stringsURL leakWhat it doesSensitive data captured in URLs, logged by proxies and browsers.SeverityMediumExploit complexitySimple
CWECWE-209WeaknessError message information leakStack trace leakWhat it doesErrors that reveal internals — stack traces, framework versions, paths.SeverityMediumExploit complexitySimple
CWECWE-201WeaknessCross-site leakXS-LeakWhat it doesSide-channel attacks that read cross-origin state through browser APIs.SeverityMediumExploit complexityDifficult
Cryptography
CWECWE-798WeaknessHard-coded credentialsWhat it doesPasswords, keys, or tokens baked into source code.SeverityCriticalExploit complexitySimple
CWECWE-330WeaknessInsufficient entropyWeak randomnessWhat it doesRandom values predictable enough to guess — session IDs, tokens, salts.SeverityHighExploit complexityModerate
CWECWE-327WeaknessInsecure cryptographic hashMD5, SHA1What it doesUsing deprecated hashes for passwords or integrity checks.SeverityHighExploit complexitySimple
CWECWE-311WeaknessMissing encryption of sensitive dataWhat it doesData stored or transmitted in plaintext where encryption is required.SeverityCriticalExploit complexitySimple
CWECWE-338WeaknessInsecure randomnessPRNG misuseWhat it doesUsing non-cryptographic RNGs for security-sensitive values.SeverityHighExploit complexityModerate
Configuration & deployment
CWECWE-16WeaknessSecurity misconfigurationWhat it doesDefault, verbose, or permissive configurations left in production.SeverityHighExploit complexitySimple
CWECWE-1188WeaknessInsecure default configurationsWhat it doesShipping with defaults that assume trust — admin routes open, debug enabled.SeverityHighExploit complexitySimple
CWECWE-1104WeaknessVulnerable & outdated componentsKnown CVEsWhat it doesDependencies with known vulnerabilities, left unpatched.SeverityHighExploit complexitySimple
CWECWE-295WeaknessImproper certificate validationTLS bypassWhat it doesSkipping or weakening cert checks, opening the door to MITM.SeverityHighExploit complexitySimple
CWECWE-668WeaknessAdmin & debug interfaces exposedWhat it doesAdmin panels, debug endpoints, or metrics routes reachable from the public internet.SeverityHighExploit complexitySimple
Session & API
CWECWE-285WeaknessBroken function level authorizationBFLAWhat it doesAPI endpoints that perform privileged actions without authorization checks.SeverityCriticalExploit complexitySimple
CWECWE-213WeaknessExcessive data exposure via APIWhat it doesAPI responses returning more data than the client needs, including sensitive fields.SeverityHighExploit complexitySimple
CWECWE-770WeaknessLack of rate limitingNo throttlingWhat it doesUnbounded requests enable brute force, scraping, and enumeration.SeverityMediumExploit complexitySimple
CWECWE-915WeaknessMass assignmentAuto-bindingWhat it doesBinders accepting fields the user shouldn't control — role, isAdmin, etc.SeverityHighExploit complexitySimple

The memory safety classes — buffer overflow, out-of-bounds read/write, use-after-free, integer overflow — apply to native dependencies and tooling, not your application code. We track them because every stack runs on C libraries somewhere, and a CVE in libwebp or OpenSSL hits production the same as a SQL injection.

How they connect.

Each layer covers different categories. Some need two layers. Session & API spans all three — that's where defense in depth earns its name.

Weakness category
Application & Web
Auth & Access
Data & Encryption
Injection & code execution
Access control
Input & file handling
Memory safety
Data exposure & leakage
Cryptography
Configuration & deployment
Session & API

Five of the eight categories are defended at two or more layers. Session & API touches all three — which is why it sits on its own row, not folded into one. When a weakness crosses boundaries, the controls do too.

Before we ship.

A checklist we close on every project before launch. Nothing leaves staging with an open box.

Threat model reviewed and updated
All inputs validated and encoded
Parameterized queries on every database call
Auth and authz checks on every route and endpoint
RBAC roles tested with edge cases
Session timeout, rotation, and invalidation configured
Secrets in a vault, none in code or repos
TLS enforced, HSTS enabled, security headers set
Dependencies scanned, no known critical CVEs
Sensitive data encrypted at rest, pseudonymized where possible
Backups configured and restore tested
Pentest complete, findings addressed or documented

“The product is stable and delivering positive outcomes for customers. They deliver on time, are responsive, and provide helpful feedback and push back when necessary. They stayed involved as the product evolved.”

— Shea, Founder, Cybersecurity Awareness Training CompanyVerified on Clutch

Security across the six phases.

Security isn't a separate track. It lives inside the same six-phase process we run on every project — just with teeth at each step.

01Plan

Threat modeling, security requirements, compliance scope

02Analyze & Design

Secure architecture, auth model, data flow mapping

03Develop

Input validation, parameterized queries, secret management

04Test

Pentest, dependency scanning, automated security gates

05Launch

Environment hardening, security checklist, monitoring

06Maintain

Patching, incident response, periodic audits

Mapped to OWASP.

Our internal list lines up with the OWASP Top 10 (2021). Every category is covered by at least one of the weakness classes we track — or by a process step.

A01

Broken Access Control

CWE-862CWE-269CWE-863CWE-639CWE-732CWE-306CWE-285CWE-915
A02

Cryptographic Failures

CWE-312CWE-330CWE-327CWE-311CWE-338
A03

Injection

CWE-79CWE-89CWE-352CWE-78CWE-94CWE-77CWE-918CWE-611CWE-1336
A04

Insecure Design

Addressed through threat modeling and security requirements in the Plan phase.

A05

Security Misconfiguration

CWE-16CWE-1188CWE-295CWE-668
A06

Vulnerable & Outdated Components

CWE-1104
A07

Identification & Authentication Failures

CWE-287CWE-384CWE-798
A08

Software & Data Integrity Failures

CWE-502
A09

Security Logging & Monitoring Failures

Addressed through structured logging, alerting, and incident response in the Maintain phase.

A10

Server-Side Request Forgery (SSRF)

CWE-918

A04 (Insecure Design) and A09 (Logging & Monitoring) aren't single weaknesses — they're properties of the process. We address them through threat modeling in the Plan phase and structured logging in the Maintain phase.

Quick answers.

Do you run penetration testing?

Yes. We pentest before launch and on a regular cadence after. We also run automated security scans in CI, so most issues get caught long before a human picks up a tool.

Do you follow OWASP?

We track the OWASP Top 10 and the broader CWE catalog. The forty-nine classes on this page are our baseline — every project checks against them before launch, and the OWASP mapping section shows how they line up.

What stacks do these patterns apply to?

All of them. The names change — parameterized queries look different in Node and Python — but the patterns don't. We apply the same list to React, Next.js, NestJS, FastAPI, and anything else we build with.

How do you handle encryption?

AES-256-GCM for data at rest. TLS for data in transit. Encryption keys are managed separately from the data they protect, rotated on a schedule, and never hardcoded.

What about compliance — GDPR, HIPAA?

We design for the regulations that apply to your product. We've shipped HIPAA-adjacent healthcare platforms and GDPR-compliant products for EU clients. We don't hand you a compliance certificate — we build the controls that make one possible.

Do you monitor after launch?

Yes. Monitoring, alerting, and a patching cadence are part of maintenance. When a new CVE drops for a dependency we use, you hear about it from us, not from the news.

How do you handle secrets and credentials?

Environment variables and secret managers. Never in repos, never in client-side code. We audit for accidental exposure and rotate keys when team members change.

Next step

Building something
that can't afford a breach?

Tell us what you're building and what's at stake. We'll walk you through the controls that apply — and where they fit in the process.