All articlesSecurity Strategy

Web Application Security Testing Checklist Before You Launch

May 5, 2026·11 min read·Nautillo Pro Security Team

Most security vulnerabilities in production web apps were present at launch and never found. This checklist covers the checks that matter before you ship — organized by category, with severity ratings so you know what to fix first. Every item is testable without a security background.

How to use this checklist

Work through each category methodically. Items marked Critical are vulnerabilities that attackers actively look for in the first minutes of probing an application — fix these before anything else. High items have direct security impact and should be resolved before launch. Medium items are meaningful but typically require specific conditions to exploit.

This list covers the most consistently exploitable vulnerability classes. It is not exhaustive — business logic vulnerabilities specific to your application require manual review or automated simulation beyond a checklist.

Authentication & Session Management

Passwords hashed with bcrypt, scrypt, or Argon2 — not MD5, SHA1, or plain SHA256

Critical

Login endpoint rate-limited — brute force requires more than a few thousand requests

High

Account lockout or CAPTCHA after repeated failed logins

High

Session tokens are cryptographically random — not sequential or predictable

Critical

Session invalidated on logout — not just deleted client-side

High

Session invalidated after password change

High

Session cookie has HttpOnly flag — not readable by JavaScript

High

Session cookie has Secure flag — only sent over HTTPS

High

Session cookie has SameSite=Strict or Lax — CSRF protection

Medium

Password reset tokens are single-use and expire within 1 hour

High

Password reset tokens are invalidated after use — not reusable

High

Multi-factor authentication available for privileged accounts

Medium

Authorization & Access Control

Every API endpoint verifies the requesting user owns the accessed resource (IDOR check)

Critical

Admin-only endpoints return 403 for non-admin users — not 404 or 200 with empty data

Critical

Authorization checked server-side — not based on client-supplied role or flag

Critical

Horizontal privilege: User A cannot access User B's data by changing an ID

Critical

Vertical privilege: Regular users cannot access admin functionality by direct URL

Critical

Inactive or deleted users' data is inaccessible — not just hidden from the UI

High

API endpoints that accept a user ID in the request body validate it against the authenticated session

High

Input Validation & Injection

SQL queries use parameterized queries or prepared statements — no string concatenation

Critical

All user input rendered in HTML is output-encoded — no raw innerHTML with user data

High

File uploads validate MIME type server-side — not just the file extension

High

File upload filenames are sanitized or replaced before storage

High

Uploaded files are not directly executable — stored outside web root or behind a CDN

Critical

XML parsing has external entity processing disabled (XXE prevention)

High

Server-side template rendering uses safe context — no user input evaluated as template code

Critical

Command execution functions do not include user-supplied input without strict allowlist validation

Critical

Redirect targets are validated against an allowlist — open redirects blocked

Medium

API Security

All API endpoints require authentication — no accidentally public endpoints

Critical

API rate limiting in place — bulk data extraction requires unusual request volume

High

GraphQL introspection disabled in production

Medium

GraphQL query depth and complexity limits set — no unbounded nested queries

Medium

CORS policy is restrictive — wildcard (*) origin not used with credentialed requests

High

API versioning in place — deprecated endpoints return 410 Gone, not live responses

Low

Error responses do not include stack traces, SQL errors, or internal paths

Medium

JWT tokens validated server-side — algorithm, expiry, and signature all checked

Critical

JWT secret is strong and rotated — not a default or weak value

Critical

Sensitive Data Exposure

All data in transit encrypted with TLS 1.2+ — no HTTP endpoints for authenticated routes

Critical

HSTS header set — browsers enforce HTTPS for all future visits

High

Sensitive data (passwords, tokens, keys) not logged — check application logs

High

API responses return only necessary fields — no accidental user data leakage in bulk endpoints

High

Database connection strings and API keys not in version control or client-side code

Critical

Backup files and old deployments not accessible via predictable URLs

High

Debug mode disabled in production — no verbose error pages

Medium

Directory listing disabled on all web servers

Medium

Infrastructure & Configuration

Default credentials changed on all services — databases, admin panels, cloud consoles

Critical

Unnecessary services and ports closed — attack surface minimized

High

Security headers set: X-Frame-Options, X-Content-Type-Options, Referrer-Policy

Medium

Content Security Policy defined — inline scripts restricted or eliminated

Medium

Dependency vulnerabilities scanned — no known CVEs in production dependencies

High

Cloud storage buckets not publicly readable unless intentionally public

Critical

Internal admin interfaces not exposed to the public internet

Critical

Subdomains enumerated and secured — forgotten staging environments removed

Medium

What this checklist doesn't cover

A checklist tests for known patterns. It will not find vulnerabilities that are specific to your application's business logic — a price manipulation flaw in your checkout, a workflow bypass in your approval process, or an access control gap that only makes sense given how your users are structured.

It also won't catch every injection variant, every authentication edge case, or every way a combination of individually-acceptable behaviors creates a vulnerability when chained together. For that you need either a manual penetration tester or an automated simulation that actually attempts exploit paths rather than checking for known signatures.

Checklist

Known patterns, configuration checks, code review items. Fast to run, easy to understand.

Misses novel chains and business logic

Automated simulation

Actively attempts exploit paths, confirms impact with HTTP evidence, runs in minutes.

Limited on bespoke business logic

Manual pentest

Human reasoning across trust boundaries, creative chaining, compliance-grade reports.

Expensive, point-in-time only

Run the automated checks in minutes

Nautillo Pro automatically tests for the Critical and High items in this checklist — injection vulnerabilities, authentication weaknesses, access control failures, and API security issues — against your live application. Every confirmed finding includes HTTP proof. Free to start, no credit card required.