Do meu ponto de vista, os ataques de injeção de SQL podem ser evitados por:
- Triagem cuidadosa, filtragem, entrada de codificação (antes da inserção no SQL)
- Usando instruções preparadas / consultas parametrizadas
Suponho que existem prós e contras para cada um, mas por que o nº 2 decolou e se tornou considerado mais ou menos a maneira de fato de impedir ataques de injeção? É apenas mais seguro e menos propenso a erros ou houve outros fatores?
Pelo que entendi, se o item 1 for usado corretamente e todas as advertências forem atendidas, ele poderá ser tão eficaz quanto o item 2.
Higienização, filtragem e codificação
Houve alguma confusão da minha parte entre o que significa higienizar , filtrar e codificar . Eu direi que, para meus propósitos, todas as opções acima podem ser consideradas para a opção 1. Nesse caso, eu entendo que a limpeza e a filtragem têm o potencial de modificar ou descartar dados de entrada, enquanto a codificação preserva os dados como estão , mas os codifica. corretamente para evitar ataques de injeção. Acredito que a fuga de dados pode ser considerada uma forma de codificá-los.
Consultas com parâmetros versus biblioteca de codificação
Existem respostas onde conceitos parameterized queries
e encoding libraries
que são tratados de forma intercambiável. Corrija-me se estiver errado, mas tenho a impressão de que são diferentes.
Meu entendimento é que encoding libraries
, por melhores que sejam, sempre têm o potencial de modificar o "Programa" do SQL, porque estão fazendo alterações no próprio SQL, antes de ser enviado ao RDBMS.
Parameterized queries
por outro lado, envie o programa SQL para o RDBMS, que otimiza a consulta, define o plano de execução da consulta, seleciona índices a serem usados etc., e depois conecta os dados, como a última etapa dentro do RDBMS em si.
Biblioteca de codificação
data -> (encoding library)
|
v
SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement
Consulta parametrizada
data
|
v
SQL -> RDBMS (query execution plan defined) -> data -> execute statement
Importância histórica
Algumas respostas mencionam que, historicamente, as consultas parametrizadas (PQ) foram criadas por motivos de desempenho e antes que os ataques de injeção direcionados a problemas de codificação se tornassem populares. Em algum momento, ficou claro que o PQ também era bastante eficaz contra ataques de injeção. Para manter o espírito da minha pergunta, por que o PQ permaneceu o método de escolha e por que floresceu acima da maioria dos outros métodos quando se trata de impedir ataques de injeção de SQL?