sql >> Database >  >> RDS >> Mysql

Voorkomt Knex.js sql-injectie?

Lees zorgvuldig uit de knex-documentatie hoe u waarden aan knex raw kunt doorgeven (http://knexjs.org/#Raw ).

Als u waarden doorgeeft als parameterbinding aan raw zoals:

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

In dat geval worden parameters en queryreeks afzonderlijk doorgegeven aan het databasestuurprogramma dat de query beschermt tegen SQL-injectie.

Andere methoden voor het maken van query's gebruiken altijd intern het bindingsformaat, dus ze zijn ook veilig.

Om te zien hoe een bepaalde query wordt doorgegeven aan het databasestuurprogramma kan men het volgende doen:

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

Welke SQL-string en bindingen zal uitvoeren die aan het stuurprogramma zijn gegeven voor het uitvoeren van de query (https://runkit.com/ embed/2yhqebv6pte6 ).

De grootste fout die men kan maken met onbewerkte knex-query's is het gebruik van een javascript-sjabloontekenreeks en het rechtstreeks interpoleren van variabelen naar het SQL-tekenreeksformaat, zoals:

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

Een ding om op te merken is dat knex-tabel-/identificatienamen niet kunnen worden doorgegeven als bindingen aan het stuurprogramma, dus met deze moet men extra voorzichtig zijn om geen tabel-/kolomnamen van gebruikers te lezen en ze te gebruiken zonder ze eerst correct te valideren.

Bewerken:

Door te zeggen dat identifier-namen niet als bindingen kunnen worden doorgegeven, bedoel ik dat wanneer men ?? . gebruikt knex -binding voor id-naam, die wordt weergegeven als onderdeel van de SQL-tekenreeks wanneer deze wordt doorgegeven aan het databasestuurprogramma.




  1. Waarom hebben we de GLOB-clausule in SQLite nodig?

  2. Waar/Onwaar versus 0/1 in MySQL

  3. Hoe een tijdelijke kolom te gebruiken in de waar-clausule?

  4. Hoe meervoudig voortschrijdend gemiddelde te berekenen in MySQL