Læs omhyggeligt fra knex-dokumentationen, hvordan du overfører værdier til knex raw (http://knexjs.org/#Raw ).
Hvis du overfører værdier som parameterbinding til rå som:
knex.raw('select * from foo where id = ?', [1])
I så fald sendes parametre og forespørgselsstreng separat til databasedriveren, der beskytter forespørgslen mod SQL-injektion.
Andre forespørgselsbyggermetoder bruger altid bindingsformat internt, så de også er sikre.
For at se, hvordan en bestemt forespørgsel sendes til databasedriveren, kan man gøre:
knex('foo').where('id', 1).toSQL().toNative()
Som udsender SQL-streng og bindinger, der er givet til driveren til at køre forespørgslen (https://runkit.com/ embed/2yhqebv6pte6 ).
Den største fejl, man kan begå med knex-råforespørgsler, er at bruge javascript-skabelonstreng og interpolere variabler direkte til SQL-strengformat som:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS
En ting at bemærke er, at knex tabel-/identifikatornavne ikke kan overføres som bindinger til driveren, så med dem skal man være ekstra forsigtig med ikke at læse tabel-/kolonnenavne fra brugeren og bruge dem uden at validere dem ordentligt først.
Rediger:
Ved at sige, at identifikatornavne ikke kan overføres som bindinger, mener jeg, at når man bruger ??
knex -binding for identifikatornavn, der vil blive gengivet som en del af SQL-strengen, når den sendes til databasedriveren.