Yashveer Singh
Connect
<- All posts
Security, Auth, and Compliance7 min read

SQL Injection in 2026: Still Happening, Still Preventable

SQL injection has been on the OWASP Top 10 for two decades. It is still being exploited. Here is why and how to stop it.

Written by Yashveer Singh, founder of Yashveer Labs.

# SQL Injection in 2026: Still Happening, Still Preventable

SQL injection is a vulnerability where user-controlled input is included in a SQL query without proper sanitization, allowing an attacker to modify the query's logic, extract unauthorized data, or destroy data. It is one of the oldest known web vulnerabilities and remains one of the most exploited. The reason it persists is not that developers do not know about it; it is that the unsafe pattern (string concatenation into a SQL query) is the intuitive pattern, and parameterized queries require a deliberate choice.

What you need to know

  • Parameterized queries (also called prepared statements) are the primary defense; they separate the SQL structure from user data at the database driver level
  • ORMs like Prisma, Sequelize, and Active Record use parameterized queries by default; the risk is when developers bypass the ORM to write raw queries
  • The most dangerous injection surface is search functionality, advanced filtering, and any query that includes user-provided column names, table names, or sort directions
  • Stored procedures do not prevent SQL injection unless they themselves use parameterized input handling
  • SQL injection can be blind (no visible error output), time-based, or error-based; automated tools can exploit all three variants

The core argument

The mental model that produces SQL injection is: "I need the user's input in the query, so I will put it in the query." The correct mental model is: "I need the user's input to affect the query's behavior, so I will pass it as a parameter." Those two mental models produce very different code and very different security outcomes.

String concatenation: "SELECT * FROM users WHERE email = '" + userEmail + "'". If userEmail is '; DROP TABLE users; --, the resulting query is SELECT * FROM users WHERE email = ''; DROP TABLE users; --'. The database executes all of it. The table is gone.

Parameterized query: SELECT * FROM users WHERE email = $1 with [userEmail] as the parameter. The database treats the parameter as a value, not executable SQL, regardless of what it contains. The injection attempt becomes a string literal search for the malicious SQL text. It finds nothing and returns zero rows.

The pattern I audit for in every codebase I review is raw query construction: anywhere that string interpolation or concatenation is used to build a SQL query string. Modern TypeScript ORMs make this almost impossible to accidentally do; the risk is in legacy code, quick debug queries that made it to production, or raw query escape hatches used for complex operations. For Nexli, every query that could involve user input goes through the ORM parameterization layer. The one place I use raw SQL (complex reporting queries with dynamic column selection) uses allowlisted column names checked against a hardcoded array before being interpolated into the query.

Common mistakes

  1. Using string interpolation in raw queries. Even engineers who know about SQL injection write it accidentally when they are in a hurry. Code review should flag any query construction with string interpolation.
  1. Assuming ORM usage makes you immune. ORMs prevent injection for standard operations. Raw query escape hatches, dynamic column/table names, and query-building libraries with improper use can still produce injection vulnerabilities.
  1. Not escaping user input that appears in LIKE clauses. WHERE name LIKE '%' + userInput + '%' is vulnerable even in parameterized queries if the LIKE wildcards are in the query structure. The user input itself should also be escaped for LIKE special characters (%, _).
  1. Relying on input validation alone. Validating that user input "looks like" safe data is not a substitute for parameterized queries. A valid-looking email address can still contain SQL injection characters. Defense in depth means both validation and parameterization.
  1. Not testing for SQL injection. Run sqlmap or a manual test on every input field that interacts with a database query. Test before launch and after adding new query paths.

Where to start

  1. Audit every raw query in the codebase. Search for string interpolation in SQL strings. Every instance is either a confirmed vulnerability or a pattern that needs to be reviewed carefully. Convert unsafe patterns to parameterized queries.
  1. Enforce parameterized queries in code review. Add a code review check for raw query construction. Many teams add a linting rule (eslint-plugin-security or similar) that flags string interpolation in common query patterns.
  1. Run sqlmap against your staging environment. Sqlmap is an open source automated SQL injection tool. Running it against your staging environment before launch tells you what an attacker would find without the consequences of a real attack.

Related reading

FAQ

Frequently asked

Author

Why you should skip the agency and hire me instead

Agencies markup engineering work by three to five times. Yashveer Singh, founder of Yashveer Labs. I do the work directly. No project manager, no account manager, no overhead. The engineer you talk to is the engineer who writes the code. That changes the math on price, speed, and quality at the same time. If that sounds like the shape of project you have, we should talk.

Related reading