Mysql
 sql >> Base de données >  >> RDS >> Mysql

Knex.js empêche-t-il l'injection SQL ?

Lisez attentivement la documentation de knex pour savoir comment transmettre des valeurs à knex raw (http://knexjs.org/#Raw ).

Si vous transmettez des valeurs en tant que paramètre de liaison à raw comme :

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

Dans ce cas, les paramètres et la chaîne de requête sont transmis séparément au pilote de base de données protégeant la requête de l'injection SQL.

Les autres méthodes de création de requêtes utilisent toujours le format de liaison en interne afin qu'elles soient également sécurisées.

Pour voir comment certaines requêtes sont passées au pilote de base de données, on peut faire :

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

Qui produira la chaîne SQL et les liaisons qui sont données au pilote pour exécuter la requête (https://runkit.com/ intégrer/2yhqebv6pte6 ).

La plus grosse erreur que l'on puisse faire avec les requêtes brutes knex est d'utiliser la chaîne de modèle javascript et d'interpoler les variables directement au format de chaîne SQL comme :

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

Une chose à noter est que les noms de table/identifiant knex ne peuvent pas être transmis en tant que liaisons au pilote, donc avec ceux-ci, il faut faire très attention à ne pas lire les noms de table/colonne de l'utilisateur et les utiliser sans les valider correctement au préalable.

Modifier :

En disant que les noms d'identifiant ne peuvent pas être passés en tant que liaisons, je veux dire que lorsque l'on utilise ?? knex -binding pour le nom de l'identifiant, qui sera rendu dans le cadre de la chaîne SQL lorsqu'il sera transmis au pilote de base de données.