Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verhindert Knex.js die SQL-Injektion?

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.