sql >> Base de Datos >  >> RDS >> Mysql

¿Knex.js evita la inyección de sql?

Lea detenidamente la documentación de knex sobre cómo pasar valores a knex raw (http://knexjs.org/#Raw ).

Si está pasando valores como enlace de parámetros a raw como:

knex.raw('select * from foo where id = ?', [1])

En ese caso, los parámetros y la cadena de consulta se pasan por separado al controlador de la base de datos que protege la consulta de la inyección SQL.

Otros métodos de generación de consultas siempre usan el formato de vinculación internamente, por lo que también son seguros.

Para ver cómo se pasa cierta consulta al controlador de la base de datos, se puede hacer:

knex('foo').where('id', 1).toSQL().toNative()

Lo que generará una cadena SQL y los enlaces que se le dan al controlador para ejecutar la consulta (https://runkit.com/ incrustar/2yhqebv6pte6 ).

El mayor error que se puede cometer con las consultas sin procesar de knex es usar una cadena de plantilla de javascript e interpolar variables directamente al formato de cadena SQL como:

knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS 

Una cosa a tener en cuenta es que los nombres de la tabla/identificador knex no se pueden pasar como enlaces al controlador, por lo que con esos se debe tener mucho cuidado de no leer los nombres de la tabla/columna del usuario y usarlos sin validarlos correctamente primero.

Editar:

Al decir que los nombres de los identificadores no se pueden pasar como enlaces, quiero decir que cuando uno usa ?? knex -binding para el nombre del identificador, que se representará como parte de la cadena SQL cuando se pase al controlador de la base de datos.