flawopen.com/Injection SQL en JavaScript/Sequelize
Sequelize query() protège-t-il contre les injections SQL ?
Un paramètre ressemble à une fiche de valeur scellée : SQL reçoit la valeur séparément des instructions. Dans Sequelize v6, bind transmet les valeurs à part ; replacements les échappe et les insère avant l’envoi. Construire la chaîne avec une entrée non fiable contourne les deux. Aucun ne remplace les noms de tables ou colonnes.
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
Garder les valeurs hors de la syntaxe SQL
Dans Sequelize v6, Sequelize échappe et insère replacements avant l’envoi de la requête à la base ; bind transmet les valeurs séparément du texte SQL. Les deux évitent de concaténer des valeurs utilisateur, mais la syntaxe dépend de la méthode et du dialecte. Les paramètres ne représentent ni noms de tables ou colonnes, ni tri, ni fragments SQL. Associez la structure sélectionnable à une allowlist fixe de l’application. Les méthodes de modèle peuvent paramétrer les valeurs structurées courantes, mais le SQL raw et les expressions littérales doivent aussi être vérifiés.
Auditer les requêtes Sequelize
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .FAQ
Les valeurs structurées ordinaires sont traitées par la construction de requêtes Sequelize. Vérifiez néanmoins le SQL raw, les expressions littérales et les chaînes assemblées par l’application. Le paramétrage n’autorise pas l’accès aux enregistrements et ne valide pas les règles métier.
Références
- Documentation Sequelize v6 — Raw Queries, replacements et paramètres bind
- OWASP — Prévention des injections SQL
- flawopen.com — Injection SQL en JavaScript