Skip to content

Web Application Security Checklist: 15 Vulnerabilities Every App Must Handle

A web application security checklist built on the OWASP Top 10:2025: 15 vulnerabilities, what each costs your business, and what to ask your developer.

By

Freelance full-stack developer

Published
Reading time
8 min
In this post9

This web application security checklist covers the 15 vulnerabilities I'd check first in any web app: users reaching other users' data, guessable logins, outdated dependencies, leaked API keys and failures nobody notices. It's built on the OWASP Top 10:2025, and each item comes with the business risk and one question to put to your developer.

Full disclosure: I maintain web apps for a living, so weigh my advice on getting help accordingly.

The short answer: the OWASP Top 10 in plain English

The OWASP Top 10:2025 is the most widely used list of web application security risks, and the 2025 edition added a new category for mishandled errors. Here's what each category means for your business, and which items cover it.

OWASP 2025What it means for youItems
A01 Broken Access ControlUsers can see or do more than they should1-3
A02 Security MisconfigurationThe server or app is set up wrong5
A03 Software Supply Chain FailuresPackages and tools with known holes7
A04 Cryptographic FailuresPasswords and data are poorly protected8
A05 InjectionUser input gets executed as code9-10
A06 Insecure DesignYour business rules can be gamed11-12
A07 Authentication FailuresLogins can be guessed, bypassed or leaked4, 6
A08 Software or Data Integrity FailuresThe app trusts data it never verified13
A09 Security Logging and Alerting FailuresNobody notices when things go wrong15
A10 Mishandling of Exceptional ConditionsErrors that leak information or open doors14

Short on time? Start with items 1, 2, 4, 5 and 7, which in my view hit the most apps. Security belongs in every stage of the development process, so run this list regularly, not only before launch.

Access and authentication (items 1-4)

Access control bugs are hard to spot because the app works perfectly for anyone using it as intended.

Access and authentication

  • 1. Other users' data is one ID away: If changing /invoices/1041 to /invoices/1042 shows a stranger's invoice, you have a data breach. Ask: "Does the server check ownership on every request, and is that covered by automated tests?"
  • 2. Permissions enforced only in the UI: Hiding the admin button doesn't protect the function behind it. Any user can call it directly. Ask: "Where are roles enforced in the code, and can users change their own role?"
  • 3. Cross-site request forgery (CSRF): A malicious site makes a logged-in user's browser submit a form to your app, for example one that changes the account email. Ask: "Do all forms and requests that change data have CSRF protection?"
  • 4. Logins that can be guessed or bypassed: Without rate limiting, bots can try passwords leaked from other sites. Ask: "Do we limit login attempts, require two-factor for admins and expire password reset links?"

Configuration, secrets and dependencies (items 5-8)

Configuration, secrets and dependencies

  • 5. Misconfigured production: Debug mode left on, default credentials, exposed admin panels or missing HTTPS. Laravel's documentation on debug mode warns that it can expose sensitive configuration values to users in production. Ask: "How do we make sure production is configured differently from development?"
  • 6. Secrets in the code: API keys for payments, email or AI left in the code, Git history or browser can run up your bill. Ask: "Where are our keys stored, who can access them, and when were they last rotated?"
  • 7. Outdated dependencies: Once a vulnerability in a package is published, anyone can read how to exploit it. Ask: "How do we hear about security updates, and how quickly are they installed?"
  • 8. Passwords and data stored badly: Passwords should be hashed with a modern algorithm such as bcrypt or Argon2, never stored in plain text. Sensitive fields and backups should be encrypted. Ask: "How are passwords stored, and are our backups encrypted?"

Item 7 is the one that slips once an app is live. Here's what it costs to let framework and package updates pile up.

User input and business logic (items 9-12)

Treat everything users send your app as potentially hostile. Modern frameworks block much of this by default, one of the reasons Laravel is my default choice. But the protection only works if the code uses it.

User input and business logic

  • 9. SQL injection: User input goes straight into a database query, so a search box can be used to read or delete your data. Ask: "Do we use parameterized queries everywhere, including hand-written SQL?"
  • 10. Cross-site scripting (XSS): Text from one user, such as a comment, runs as code in another user's browser. If it hits an admin, the attacker can take over the account. Ask: "Is all user content escaped on output, and where have we deliberately turned that off?"
  • 11. Unrestricted file uploads: Without checks on file type and size, someone can upload code that runs on your server. Private documents should never sit behind a public link. Ask: "Which file types do we accept, and how are private files protected?"
  • 12. Business logic that can be gamed: Prices sent from the browser, discount codes that work forever, or no cap on costly actions like SMS or AI calls. Ask: "What happens if someone calls our API directly 1,000 times a minute?"

No scanner will find item 12 for you. OWASP's own example under insecure design is a cinema chain where an attacker could book 600 seats in a few requests. What was missing was a business rule about how much one person can book.

Integrations, errors and monitoring (items 13-15)

Integrations, errors and monitoring

  • 13. Unverified data and code: A payment webhook needs a verified signature, otherwise anyone can mark an order as paid. The same goes for third-party scripts and deploy access. Ask: "Do we verify signatures on every webhook, and who can push code to production?"
  • 14. Errors that leak or fail open: Detailed error messages show attackers how your system works. Worse is code that "fails open", such as approving an order when the payment check times out. Ask: "What does a user see when something breaks, and do we deny by default when a check fails?"
  • 15. No logging or alerting: Without logs, you hear about a breach when a customer calls, and you can't tell which data was touched. Ask: "What do we log, how long do we keep it, and who gets alerted?"

Item 15 also has a legal edge in the EU. Under GDPR Article 33, a breach must be reported to your data protection authority without undue delay and, where feasible, within 72 hours of becoming aware of it. That's hard if you can't see what happened.

How to judge your developer's answers

Good answers are specific: they name where a check lives, which tool runs it or which test covers it. "Every route has a server-side permission check, and our tests try to load another user's data" is a solid answer to items 1 and 2. "We've never had a problem" usually means nobody has looked.

When this checklist is overkill, and when it isn't enough

If you run a marketing website without logins, payments or sensitive data, most of these items don't apply. Keep the CMS and plugins updated, turn on two-factor for admins, and keep a backup you've actually restored.

If your app handles health data, or enterprise customers ask for security documentation, buy a penetration test from a firm that does nothing but security. I'm a developer, not a penetration tester. My job is to build and maintain the code so the holes don't appear, and to fix what a test finds.

Vague answers to most questions usually point to more than a security problem. Look at the signs of a healthy codebase. Security holes are often the part of technical debt that comes due first.

Next steps

  1. Send the 15 questions to your developer or agency and ask for written answers.
  2. Start with the items where the answer is vague or missing.
  3. Agree on maintenance that includes security updates, so this isn't a one-off.

If nobody is watching your app today, see how I handle ongoing maintenance and development for web apps. You work directly with the developer who writes the code.

Frequently asked questions

Is following the OWASP Top 10 a legal requirement?

No. The OWASP Top 10 is an awareness document, not a law or a certification. In the EU, GDPR Article 32 requires security appropriate to the risk, and OWASP is a common reference for what that means in a web app. If a contract or industry rule names a specific standard, that one applies. This isn't legal advice.

How often should a web application be security tested?

Continuously, plus scheduled reviews. I recommend weekly automated alerts for vulnerable packages, a permissions check with every major feature and a full pass through this checklist at least yearly. With sensitive data or many users, add an external penetration test before launch and then yearly.

Who is liable if our web app is breached?

In most cases, your company. As the data controller under GDPR, you're responsible for appropriate security of the personal data your app processes, even if an outside developer built it. What you can claim from that developer depends on your contract and data processing agreement. Talk to a lawyer about your specific situation.