Posted on
September 10, 2026
Updated on
September 15, 2026
Read time
11 mins read
Quick Answer: A web application is ready to launch when 25 controls across six layers (authentication, authorization, data, dependencies, infrastructure, and monitoring) have each been verified by someone, on purpose, recently. Not assumed. Verified.
The priority order is not guesswork: broken access control holds the #1 spot in the OWASP Top 10:2025, where 100% of applications tested showed some form of it, and IBM puts the global average cost of a data breach at $4.88 million. Every control below includes what it protects against, how to verify it in about an hour, and the common way it’s done wrong, so a technical founder can turn “I think so” into “checked, on this date, by this person.”
The email that prompts this article arrives in every founder’s inbox eventually. An enterprise prospect is interested, the deal is real, and attached is a security questionnaire: 40 questions, sometimes 200. You read “Is customer data encrypted at rest?” and “Are access controls enforced server-side?” and you answer yes, because you believe so, because your developers are good people, and because no is not an answer that closes deals.
Then, somewhere around question 30, the honest thought arrives: I don’t actually know if these answers are true.
This checklist exists for that moment. It is the 25 controls we verify as a custom web development company in the USA market before we let anything we build face the internet, grouped into six layers, each with the attack it prevents, a verification you can run in about an hour, and the specific way teams get it wrong while believing they got it right.
Why Security Questionnaires Expose More Than Penetration Tests
A penetration test is a snapshot: skilled people attack the application for a week and report what broke. It is valuable, and it answers a narrow question: what could this team exploit, this week. A questionnaire asks a more revealing one: do you know your own security posture? “Is data encrypted at rest?” has three possible states: yes, no, and the most dangerous one, “we assume so.” Questionnaires are embarrassing precisely because they expose the third state, and the third state is where breaches live.
Security researcher Bruce Schneier compressed the whole discipline into seven words:
“Security is a process, not a product.”
Bruce Schneier, The Process of Security (2000)
The process, concretely, is verification with a name and a date attached. That is all this checklist asks: 25 controls, each moved from “assumed” to “checked.” Here is the map.

Layer 1: Authentication and Sessions (Controls 1-5)
Authentication is the front door, and attackers rarely pick the lock; they try keys stolen from somewhere else. These five controls assume credential-stuffing lists and phished passwords are already in play, because they are.
| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 1. Modern password hashing (bcrypt, scrypt, or Argon2) | A stolen database becoming usable passwords | Look at one stored hash: it should start with $2b$, $argon2, or similar | MD5/SHA-1, or a homemade scheme from an old tutorial |
| 2. MFA available, enforced for admins | Account takeover with a phished or reused password | Try to log into an admin account with password alone | MFA offered to users, admin panel exempt “for convenience” |
| 3. Rate limiting and lockout on auth endpoints | Credential stuffing and brute force | Script 50 rapid login attempts against staging; count how many are processed | The login form is limited, the API endpoint behind it isn’t |
| 4. Session expiry and rotation | Hijacked sessions living forever | Change the password in one browser; confirm the session in a second browser dies | Tokens that never expire and survive password changes |
| 5. Secure cookie flags (HttpOnly, Secure, SameSite) | Token theft via XSS; cross-site request forgery | Open devtools, inspect the session cookie’s flags | The session token in localStorage, readable by any injected script |
Layer 2: Authorization (Controls 6-9)
This layer deserves its own headline. In the OWASP Top 10:2025, broken access control holds the #1 position, with 100% of applications tested showing some form of it, up from 94% in the 2021 edition. The most common critical flaw in web applications is not an exotic exploit. It is an authorization check that simply is not there: the UI hides the button, and the API behind it never asks who’s calling.

| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 6. Server-side authorization on every endpoint | Forced browsing to functions the UI hides | As a low-privilege user, call three admin API routes directly | Authorization lives in the frontend; the API trusts whoever arrives |
| 7. Object-level ownership checks | IDOR: reading someone else’s records by changing an ID | Log in as user A, request user B’s invoice by ID | Sequential IDs plus a lookup that never checks the owner |
| 8. Server-side role checks for admin functions | Vertical privilege escalation | Edit your role claim client-side; see if the server honors it | The role read from a client-modifiable token, unverified |
| 9. Tenant isolation in every query | Cross-tenant data leaks in multi-tenant apps | From tenant A, attempt to fetch tenant B’s data on staging | One query, somewhere, missing the tenant scope |
If you verify only one layer before launch, verify this one. It is where a SaaS development company earns its keep on multi-tenant builds, because control 9 is a discipline applied to every query ever written, not a setting.
Layer 3: Data (Controls 10-14)
Data controls decide the blast radius: whether an intrusion becomes an incident report or a regulatory event. IBM’s global average breach cost of $4.88 million is mostly made of this layer’s failures.
| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 10. TLS everywhere, with HSTS | Interception and downgrade attacks | Run an SSL Labs scan; try an http:// URL and confirm the redirect | TLS at the load balancer, plaintext between internal services |
| 11. Encryption at rest, including backups | Stolen disks, snapshots, and backup files | Check the database and the backup storage settings, separately | Production encrypted; the S3 bucket of backups, not |
| 12. Secrets in a manager, not in code | Leaked API keys and database credentials | Run a secrets scanner (gitleaks, trufflehog) over the repo and its history | The .env file that was committed once, three years ago, and lives in history forever |
| 13. PII inventory, minimization, and log hygiene | Oversized breach impact; GDPR and privacy exposure | List every PII field you store; grep the logs for emails and tokens | Full request bodies, PII included, sitting in application logs |
| 14. Backups that restore | Ransomware and data loss becoming extinction events | Restore last night’s backup to staging; time it | Backups taken daily for years, restored never |
Staring down a security questionnaire right now?
Techuz runs pre-launch security reviews against this exact checklist: every control verified, evidence collected, and a report you can attach to the questionnaire instead of hoping.
Layer 4: Dependencies (Controls 15-18)
Your application is mostly other people’s code: framework, packages, and increasingly, AI-generated snippets. This is the layer most teams skip entirely, and OWASP has ranked vulnerable and outdated components as a top-ten risk in every recent edition.
| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 15. Automated dependency scanning in CI | Shipping packages with known CVEs | Open the last five scanner alerts; check who closed them, and when | Alerts enabled, assigned to nobody, 400 unread |
| 16. Lockfiles and pinned versions | Builds silently pulling different, compromised versions | Confirm the lockfile is committed and CI installs from it | Version ranges that resolve differently in prod than on laptops |
| 17. Review of AI-generated and pasted code | Insecure patterns entering at generation speed | Sample five recent AI-assisted PRs; run SAST over auth and input paths | Generated auth code trusted because it looked idiomatic |
| 18. Least-privilege keys for third-party services | One compromised vendor unlocking everything | List every external API key and what it’s scoped to | A single god-key with full permissions, shared across services |
Control 17 is the 2026 addition to a classic list. AI assistants produce code that compiles, reads cleanly, and reproduces the average security of its training data; the risk mechanics are the ones we unpacked in why MVP speed is meaningless without technical credibility. Generated code is a draft from a stranger, and it gets a stranger’s code review.
Layer 5: Infrastructure (Controls 19-22)
| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 19. Security headers (CSP, X-Frame-Options, and peers) | XSS amplification and clickjacking | Run the site through securityheaders.com; read the grade | Whatever the framework shipped by default, unreviewed |
| 20. Parameterized queries everywhere | SQL and query injection | Grep for string-concatenated queries; run sqlmap against staging forms | The ORM used everywhere except one legacy raw query |
| 21. File upload restrictions | Remote code execution via uploaded files | Try uploading a script file with a doctored extension; check where files are stored | Client-side extension checks; uploads served from the webroot |
| 22. Environment separation | Production data and credentials leaking through dev | Check what data staging holds and who can reach it | A full production copy on every developer laptop |
Layer 6: Monitoring and Incident Readiness (Controls 23-25)
The last layer accepts an uncomfortable premise: something will eventually get through. What separates a contained incident from a $4.88 million one is how fast you notice and how prepared the first hour is.
| Control | Protects against | Verify in an hour | Common failure |
|---|---|---|---|
| 23. Centralized security logging | Blind forensics; attackers erasing their tracks | Fail five logins, then find them in the log platform | Logs stored only on the server that just got compromised |
| 24. Alerting a human actually receives | Breaches discovered by customers or journalists | Fire a test alert; confirm who was paged and how fast | Beautiful dashboards that no one is watching at 2 a.m. |
| 25. A one-page incident response plan | Chaos, delay, and legal missteps in the first hour | Run a 30-minute tabletop: “we think customer data is leaking, go” | The plan exists in one senior engineer’s head, and they’re on holiday |
The Pre-Launch Sign-Off Sheet
The checklist becomes a governance tool with one addition: a name and a date. Before launch, each layer gets an accountable owner who verifies its controls and signs. “Mostly verified” is a finding, not a pass; a control that fails verification is a ticket, not a footnote. Kept in the repo and re-run at every major release, this sheet is also the honest answer to the next security questionnaire: not “yes,” but “verified, on this date, by this person,” which is the answer enterprise buyers are actually probing for.

One honest caveat about scope: these 25 controls are the launch baseline for a typical web application, the floor that makes you a hard target rather than an easy one. Regulated industries add layers on top (HIPAA, PCI DSS, SOC 2 have their own regimes), and none of this replaces periodic penetration testing; it makes the pen test worth its fee, because the findings will be interesting instead of embarrassing. And the economics compound quietly: skipping these controls is the security version of the pattern we mapped in the hidden APR of cheap code, a discount at build time financed at breach-time interest rates.
Launch with the sheet already signed
Techuz builds with these controls in the definition of done, not bolted on before the questionnaire arrives. That’s what secure custom web development means in practice: evidence, not assurances.
FAQs
Is this checklist a replacement for a penetration test?
No, it’s the prerequisite. A pen test on an application that hasn’t verified these 25 controls produces a long list of known issues you paid to rediscover. Verify the baseline first, then let the pen test hunt for what a checklist can’t catch: logic flaws, chained exploits, and your specific blind spots.
Which security controls should we verify first?
Authorization (controls 6 through 9). Broken access control is ranked #1 in the OWASP Top 10:2025, with 100% of tested applications showing some form of it. It’s also among the cheapest to test: an afternoon of changing IDs and calling admin endpoints as a normal user reveals most of it.
How long does it take to verify all 25 controls?
Each control is designed to be verifiable in about an hour, so a focused week covers the list for a typical application. The first pass is the slow one; subsequent releases only re-verify what changed, plus a quarterly full pass.
Do these controls cover SaaS security requirements for enterprise deals?
They cover the technical majority of what questionnaires ask, especially with the sign-off sheet as evidence. Enterprise deals often add organizational requirements (SOC 2, policies, vendor management) that sit on top of this baseline rather than replacing it. Passing the technical layer is what makes the rest a paperwork exercise instead of an engineering scramble.
Is AI-generated code a real security risk or a hypothetical one?
Real, and mechanical: generated code reproduces the average patterns of its training data, including insecure ones, at a speed that outruns casual review. Control 17 treats it accordingly: the same review and static analysis as code from a stranger, because that is what it is. A web development services partner using AI tooling should be able to show you that review step in their process.
Sources
- OWASP Top 10:2025, A01 Broken Access Control
- OWASP Top 10:2021, A01 Broken Access Control (94% of tested applications)
- IBM, Cost of a Data Breach Report 2024
- Bruce Schneier, The Process of Security (2000)


