FlawOpen

flawopen.com/Injection SQL en JavaScript/Knex.js

Knex.js protège-t-il contre les injections SQL ?

Guide de référence
Réponse courte

Imaginez SQL comme un formulaire imprimé : un binding place l’entrée dans un champ de valeur ; l’interpolation l’ajoute aux instructions. Le query builder Knex et knex.raw(sql, bindings) séparent les valeurs, mais les noms de tables et de colonnes sont de la structure SQL et exigent une liste autorisée fiable.

?? est le marqueur raw d’identifiant Knex. Il cite l’identifiant sans autoriser le choix ; utilisez une liste autorisée.
SÛR — bindings et liste autorisée
const query = knex.raw(
  `SELECT * FROM users WHERE id = ${userId}`
);
NON SÛR — SQL assemblé depuis l’entrée
// L’entrée est concaténée au SQL.
const allowedSortColumns = new Set(["created_at", "name"]);

const rows = await knex("users")
  .where("id", userId)
  .orderBy(
    allowedSortColumns.has(requestedSort)
      ? requestedSort
      : "created_at",
    requestedDirection === "asc" ? "asc" : "desc"
  );

// Gardez la valeur séparée de la syntaxe SQL.
knex.raw("SELECT * FROM users WHERE id = ?", [userId]);

Comment les bindings Knex protègent les valeurs

Les méthodes comme .where(), .insert() et .select() séparent les valeurs du SQL généré. Pour le raw, transmettez les valeurs avec des bindings : knex.raw("... = ?", [value]). ? désigne une valeur et ?? un identifiant. N’interpolez pas l’entrée dans une chaîne SQL.

Les identifiants dynamiques nécessitent une liste autorisée

Un binding n’autorise pas les colonnes, tables, tris, opérateurs ou fragments SQL choisis par l’utilisateur. ?? cite un identifiant, sans décider si ce choix est permis. Associez l’option à une liste fixe avant .orderBy() ; gardez mots-clés et opérateurs fixes dans le code.

Auditer les requêtes raw

Recherchez chaque appel knex.raw() et examinez ensemble la chaîne SQL et ses bindings. Vérifiez que les valeurs sont liées et que les identifiants dynamiques proviennent d’une petite liste autorisée. Raw n’est pas automatiquement vulnérable : tout dépend de la construction du SQL et des entrées.

rg -n 'knex\.raw\(' -g '*.js' -g '*.ts' -g '*.mjs' -g '*.cjs' .

Questions fréquentes

knex.raw() empêche-t-il à lui seul les injections SQL ?

Non. Utilisez des bindings pour les valeurs non fiables, par exemple knex.raw("... = ?", [value]). L’interpolation insère la valeur dans le code SQL. Examinez chaque appel raw et ses entrées.

Puis-je utiliser ?? et accepter n’importe quelle colonne choisie par l’utilisateur ?

?? est le marqueur raw d’identifiant Knex. Il cite l’identifiant sans autoriser le choix ; utilisez une liste autorisée.

Références

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com MyBatis ${} et #{} : prévenir la SQL Injection MySQLi vs PDO : prepared statements sûres NHibernate protège-t-il contre les injections SQL ? Injection NoSQL MongoDB : filtres sûrs Un ID numérique peut-il aussi provoquer une injection SQL ? Qu'est-ce qu'une requête paramétrée ?