Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O Knex.js impede a injeção de sql?


Leia atentamente a documentação do knex sobre como passar valores para o knex raw (http://knexjs.org/#Raw ).

Se você estiver passando valores como vinculação de parâmetro para raw como:
knex.raw('select * from foo where id = ?', [1])

Nesse caso, os parâmetros e a string de consulta são passados ​​separadamente para o driver de banco de dados, protegendo a consulta da injeção de SQL.

Outros métodos do construtor de consultas sempre usam o formato de ligação internamente para que também sejam seguros.

Para ver como determinada consulta é passada para o driver de banco de dados, pode-se fazer:
knex('foo').where('id', 1).toSQL().toNative()

Que produzirá a string SQL e as ligações que são fornecidas ao driver para executar a consulta (https://runkit.com/ embed/2yhqebv6pte6 ).

O maior erro que se pode cometer com consultas raw do knex é usar a string de modelo javascript e interpolar variáveis ​​diretamente para o formato de string SQL como:
knex.raw(`select * from foo where id = ${id}`) // NEVER DO THIS 

Uma coisa a notar é que os nomes de tabelas/identificadores knex não podem ser passados ​​como ligações para o driver, portanto, com eles, deve-se ter cuidado extra para não ler nomes de tabelas/colunas do usuário e usá-los sem validá-los adequadamente primeiro.

Editar:

Ao dizer que os nomes dos identificadores não podem ser passados ​​como ligações, quero dizer que quando se está usando ?? knex -binding para o nome do identificador, que será renderizado como parte da string SQL quando passado para o driver do banco de dados.