Fix sQL query built by string interpolation in Elysia

A SQL string is assembled with a template literal or concatenation and passed to a database driver. Any value interpolated into it is executed as SQL, so a request parameter can read, modify, or destroy data the query was never meant to touch. Use the driver's parameter binding instead; every driver has it.

high likely Elysia CWE-89 / OWASP A03:2021

The vulnerable pattern in Elysia

HIGH likely SQL query built by string interpolation A03:2021 src/index.ts:23:5 21 │ // sql-injection: the email comes straight from the body into the query text. 22 │ const rows = await pool.query( 23 │ `SELECT id, role FROM users WHERE email = '${body.email}'`, │ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ query text is built at runtime 24 │ )

This finding comes from the Elysia fixture in the owlwarden test suite. A value taken from the request is interpolated into SQL, so the caller controls part of the statement. That is enough to read other users' rows, bypass a WHERE clause, or drop a table.

The corrected handler

Bind the value as a parameter. Elysia's `t` schema validates the shape; it does not make a string safe to concatenate.

const rows = await pool.query('SELECT id, role FROM users WHERE email = $1', [body.email])

If you are not using Elysia

Pass the values as query parameters instead of interpolating them. Every driver supports it, and the binding is not optional formatting - it is what stops the value being parsed as SQL.

Check your own repository

npx owlwarden scan
npx owlwarden explain sql-injection

Runs on your machine. No account, no telemetry, no network unless you ask. In CI, SARIF uploads to code scanning and the exit code is the gate.

Other Elysia checks

Rules with a tested Elysia example.

sql-injection for every framework / All rules / owlwarden