Alguien que miró mi código dijo que la consulta SQL a continuación (SELECCIONAR * DESDE...) obviamente estaba abierta a ataques. Investigué esto y parece que lo estoy haciendo correctamente usando una consulta parametrizada, pero claramente me estoy perdiendo algo.
app.get("/api/v1/:userId", async (req, res) => { try { const teammate = await db.query("SELECT * FROM teammates WHERE uid = $1", [ req.params.userId, ]);Esta consulta no está abierta a la inyección SQL, porque utiliza una consulta parametrizada. Los datos no se sustituyen por el parámetro ( $1 ), sino que se envían por separado en un mensaje de "enlace", por lo que no importa lo que contengan los datos, no se interpreta como parte de la instrucción SQL.
Además, parece que el argumento es un número entero, y la inyección SQL solo puede ocurrir con argumentos de cadena.
Alguien en esa empresa puede haber asumido que el $1 se usaría para la interpolación de cadenas, en lugar de un parámetro de consulta SQL.
Es posible que no sepan que PostgreSQL usa el sigilo del signo de dólar para un marcador de posición de parámetro de consulta. ¿Otras bases de datos como el uso de MySQL ? para un marcador de posición, y Oracle usa un : sigilo delante de un parámetro con nombre.
Escribiste el código correctamente. Vea un ejemplo similar para node.js y PostgreSQL aquí: https://node-postgres.com/features/queries La sección sobre "Consulta parametrizada" muestra específicamente ese estilo de código como defensa contra la inyección de SQL.
En retrospectiva, es mejor que no consigas ese trabajo.