Users can access data or functions they shouldn't. This includes accessing other users' records, admin pages, or API endpoints by modifying IDs or URLs.
?user_id=123 to access another user's dataNever rely on client-side checks. Verify every request against the authenticated user's permissions.
Sensitive data transmitted or stored without adequate encryption. Includes using weak algorithms, hardcoded keys, or plain-text passwords.
Never write your own crypto. Use well-tested libraries.
Attacker-controlled input is interpreted as code or commands. SQL injection is the most common โ attacker injects SQL via form fields or URLs.
Never concatenate user input into SQL strings.
Security is an afterthought in the design phase. The application is architecturally weak regardless of how well it's coded.
Ask: "How would someone abuse this feature?" before writing code. Use secure design patterns.
Default credentials, unnecessary features enabled, verbose error messages, missing security headers, or cloud storage left public.
Remove default credentials. Disable unused features. Review cloud IAM policies regularly.
Using libraries, frameworks, or OS components with known CVEs. Log4Shell, Heartbleed, and most major breaches exploit known-vulnerable components.
Use Dependabot, Snyk, or npm audit in CI/CD. Keep a software bill of materials (SBOM).
Weak authentication, missing MFA, insecure session management, or credential stuffing vulnerabilities.
Implement MFA for all accounts. Lock accounts after N failures. Use short-lived JWTs.
Code and infrastructure that doesn't protect against integrity violations โ including insecure CI/CD pipelines, unverified updates, or untrusted deserialisation.
Use subresource integrity (SRI) for CDN assets. Sign release artifacts. Restrict CI/CD pipeline access.
Without adequate logging and monitoring, breaches go undetected. The average breach dwell time (time from intrusion to detection) is 200+ days.
Log security events in a structured format. Alert on anomalies. Review logs weekly at minimum.
The server makes HTTP requests to attacker-specified URLs โ potentially reaching internal services (AWS metadata, internal APIs) not accessible from the internet.
Never fetch arbitrary user-provided URLs. Validate against an allowlist and block private IP ranges.