sql >> Databasteknik >  >> RDS >> Mysql

Förhindrar Knex.js sql-injektion?

Läs noga från knex-dokumentationen hur du överför värden till knex raw (http://knexjs.org/#Raw ).

Om du skickar värden som parameterbindning till rå som:

knex.raw('select * from foo where id = ?', [1])

I så fall skickas parametrar och frågesträng separat till databasdrivrutinen som skyddar frågan från SQL-injektion.

Andra frågebyggarmetoder använder alltid bindningsformat internt så att de också är säkra.

För att se hur en viss fråga skickas till databasdrivrutinen kan man göra:

knex('foo').where('id', 1).toSQL().toNative()

Som kommer att mata ut SQL-sträng och bindningar som ges till drivrutinen för att köra frågan (https://runkit.com/ embed/2yhqebv6pte6 ).

Det största misstaget man kan göra med knex-råfrågor är att använda javascript-mallsträng och interpolera variabler direkt till SQL-strängformat som:

knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS 

En sak att notera är att knex tabell-/identifieringsnamn inte kan skickas som bindningar till föraren, så med dessa bör man vara extra försiktig med att inte läsa tabell-/kolumnnamn från användaren och använda dem utan att först validera dem ordentligt.

Redigera:

Genom att säga att identifierarnamn inte kan skickas som bindningar menar jag att när man använder ?? knex -bindning för identifierarnamn, som kommer att återges som en del av SQL-strängen när den skickas till databasdrivrutinen.




  1. Lagra och hämta bilder i Postgresql med Java

  2. Hur frågar jag javascript vänta på att mysql tilldelar värde till php-variabel?

  3. Hur lagrar man mer än 255 char i MySQL-databasen?

  4. SQL Server String Sammansättning med Null