sql >> Databáze >  >> RDS >> Mysql

Zabraňuje Knex.js vkládání SQL?

Přečtěte si pozorně z dokumentace knex, jak předávat hodnoty do knex raw (http://knexjs.org/#Raw ).

Pokud předáváte hodnoty jako vazbu parametrů na raw jako:

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

V takovém případě jsou parametry a řetězec dotazu předány odděleně do databázového ovladače, který chrání dotaz před vložením SQL.

Jiné metody vytváření dotazů vždy interně používají formát vazby, takže jsou také bezpečné.

Chcete-li zjistit, jak je určitý dotaz předán ovladači databáze, můžete udělat:

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

Což vypíše řetězec SQL a vazby, které jsou dány ovladači pro spuštění dotazu (https://runkit.com/ embed/2yhqebv6pte6 ).

Největší chybou, kterou lze s nezpracovanými dotazy knex udělat, je použít řetězec šablony javascriptu a interpolovat proměnné přímo do formátu řetězce SQL, jako je:

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

Jedna věc, kterou je třeba poznamenat, je, že názvy tabulek/identifikátorů knex nelze předat jako vazby ovladači, takže s nimi byste měli být zvlášť opatrní, abyste nečetli názvy tabulek / sloupců od uživatele a nepoužili je, aniž byste je nejprve řádně ověřili.

Upravit:

Tím, že říkám, že názvy identifikátorů nelze předávat jako vazby, myslím, že když se používá ?? knex -binding pro název identifikátoru, který bude vykreslen jako součást řetězce SQL při předání ovladači databáze.




  1. MySQL:řazení podle uvnitř skupiny podle

  2. Jak funguje TRY_CONVERT() na serveru SQL Server

  3. Jak obnovit databázi MySQL z fyzických souborů

  4. Mysql Max se skupinou podle dotazu