sql >> Database teknologi >  >> RDS >> Mysql

Forhindrer Knex.js sql-injektion?

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.




  1. Hvordan OPDATERE en kolonne ved hjælp af en anden kolonne i en anden tabel? SQL-fejl:ORA-00933:SQL-kommando blev ikke afsluttet korrekt

  2. Opdatering af SQL Server-tabeller med færre afbrydelser ved hjælp af partitionsskift

  3. Sådan konverteres SQL Servers tidsstempelkolonne til datetime-format

  4. Forskellen mellem sys.columns, sys.system_columns og sys.all_columns i SQL Server