typescript.sql_injection
Correctness
Critical
Common in Incidents
Detects SQL queries built with string concatenation or template literals.
Why It Matters
Section titled “Why It Matters”SQL injection enables attackers to:
- Steal data — Read your entire database
- Modify data — Update, delete, or corrupt records
- Bypass authentication — Log in as any user
- Escalate privileges — Gain admin access
Template literals make it easy to write vulnerable code.
Example
Section titled “Example”// ❌ Beforeconst query = `SELECT * FROM users WHERE id = ${userId}`;await db.query(query);
// Also badconst query = "SELECT * FROM users WHERE name = '" + name + "'";// ✅ Afterawait db.query('SELECT * FROM users WHERE id = $1', [userId]);
// Or with an ORMconst user = await User.findOne({ where: { id: userId } });What Unfault Detects
Section titled “What Unfault Detects”- Template literals with SQL keywords and variables
- String concatenation in query strings
- Missing parameterized queries in known DB libraries
Auto-Fix
Section titled “Auto-Fix”Unfault can convert vulnerable queries to parameterized form when the transformation pattern is clear.
ORM Patterns
Section titled “ORM Patterns”// Prisma (safe by default)const user = await prisma.user.findUnique({ where: { id: userId }});
// TypeORM (use parameters)const user = await userRepository .createQueryBuilder('user') .where('user.id = :id', { id: userId }) .getOne();
// Knex (use parameters)const user = await knex('users') .where('id', userId) .first();
// Raw query with parametersawait knex.raw('SELECT * FROM users WHERE id = ?', [userId]);