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

Knex.js impedisce l'iniezione di sql?

Leggere attentamente dalla documentazione di knex come passare i valori a knex raw (http://knexjs.org/#Raw ).

Se stai passando valori come associazione di parametri a raw come:

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

In tal caso i parametri e la stringa di query vengono passati separatamente al driver del database che protegge la query dall'iniezione SQL.

Altri metodi di creazione di query utilizzano sempre internamente il formato di associazione, quindi sono sicuri anche loro.

Per vedere come una determinata query viene passata al driver del database si può fare:

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

Che genererà la stringa SQL e i collegamenti forniti al driver per l'esecuzione della query (https://runkit.com/ incorpora/2yhqebv6pte6 ).

L'errore più grande che si può fare con le query grezze knex è usare la stringa del modello javascript e interpolare le variabili direttamente nel formato della stringa SQL come:

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

Una cosa da notare è che i nomi di tabella/identificatore knex non possono essere passati come binding al driver, quindi con quelli si dovrebbe fare molta attenzione a non leggere i nomi di tabella/colonna dall'utente e usarli senza prima convalidarli correttamente.

Modifica:

Dicendo che i nomi degli identificatori non possono essere passati come collegamenti intendo che quando si usa ?? knex -binding per il nome dell'identificatore, che verrà visualizzato come parte della stringa SQL una volta passato al driver del database.