flawopen.com/SQL-Injection in JavaScript/Sequelize
Ist Sequelize query() vor SQL-Injection sicher?
Ein Parameter ist wie eine versiegelte Wertkarte: SQL erhält den Wert getrennt von den Anweisungen. In Sequelize v6 sendet bind Werte separat; replacements maskiert und setzt sie vor dem Senden ein. Ein String mit nicht vertrauenswürdiger Eingabe umgeht beides. Keines ersetzt Tabellen- oder Spaltennamen.
sequelize.query(
`SELECT * FROM users WHERE id = ${userId}`
)
sequelize.query(
"SELECT id FROM users WHERE id = $id",
{ bind: { id: userId },
type: QueryTypes.SELECT }
)
Werte von SQL-Syntax getrennt halten
In Sequelize v6 maskiert und setzt Sequelize replacements ein, bevor die Abfrage die Datenbank erreicht; bind sendet Werte getrennt vom SQL-Text. Beides vermeidet die Verkettung von Nutzereingaben, doch die Syntax unterscheidet sich je nach Methode und Dialekt. Parameter stehen nicht für Tabellen- oder Spaltennamen, Sortierrichtungen oder beliebiges SQL. Ordne auswählbare Strukturen einer festen, anwendungseigenen Allowlist zu. Modellmethoden können übliche strukturierte Werte parametrisieren; Raw-SQL und literale Ausdrücke müssen trotzdem geprüft werden.
Sequelize-Abfragen prüfen
rg -n 'sequelize\.query\(|Sequelize\.literal\(' --glob '*.{js,ts,mjs,cjs}' .FAQ
Übliche strukturierte Werte werden von der Sequelize-Abfragekonstruktion verarbeitet. Prüfe dennoch Raw-SQL, literale Ausdrücke und von der Anwendung zusammengesetzte Strings. Parametrisierung autorisiert keinen Datensatz und validiert keine Fachregeln.
Quellen
- Sequelize-v6-Dokumentation — Raw Queries, replacements und bind-Parameter
- OWASP — Schutz vor SQL-Injection
- flawopen.com — SQL-Injection in JavaScript