Lesen Sie sorgfältig in der Knex-Dokumentation nach, wie Werte an Knex Raw übergeben werden (http://knexjs.org/#Raw ).
Wenn Sie Werte als Parameterbindung an raw übergeben, wie:
knex.raw('select * from foo where id = ?', [1])
In diesem Fall werden Parameter und Abfragezeichenfolge separat an den Datenbanktreiber übergeben, der die Abfrage vor SQL-Injektion schützt.
Andere Abfrageerstellungsmethoden verwenden intern immer das Bindungsformat, damit sie ebenfalls sicher sind.
Um zu sehen, wie eine bestimmte Abfrage an den Datenbanktreiber übergeben wird, kann man Folgendes tun:
knex('foo').where('id', 1).toSQL().toNative()
Dadurch werden SQL-Zeichenfolgen und Bindungen ausgegeben, die dem Treiber zum Ausführen der Abfrage übergeben werden (https://runkit.com/ embed/2yhqebv6pte6 ).
Der größte Fehler, den man mit Knex-Rohabfragen machen kann, ist die Verwendung von Javascript-Vorlagen-Strings und die Interpolation von Variablen direkt in das SQL-String-Format wie:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
Zu beachten ist, dass Namen von Knex-Tabellen/Identifikatoren nicht als Bindungen an den Treiber übergeben werden können. Bei diesen sollte man also besonders darauf achten, keine Tabellen-/Spaltennamen vom Benutzer zu lesen und sie zu verwenden, ohne sie vorher ordnungsgemäß zu validieren.
Bearbeiten:
Wenn ich sage, dass Bezeichnernamen nicht als Bindungen übergeben werden können, meine ich das, wenn man ??
verwendet knex -binding für den Bezeichnernamen, der als Teil der SQL-Zeichenfolge gerendert wird, wenn er an den Datenbanktreiber übergeben wird.