quarta-feira, 14 de abril de 2010

SQL Injection - É ou não possível?

Sinceramente!? O que motivou-me a partilhar a questão sobre SQL Injection com os colegas, foi o comentário disponibilizado no post do Luís. Nele, há uma ideia clara de que um ataque de SQL Injection é possível. Ora, é mesmo possível? Interroguei-me!
Daquilo que sei a respeito, não me parece. Respondi!

SQL Injection pertence a categoria de execução de comando cujo objectivo é tomar o controlo da Aplicação Web.
Utiliza-se da construção ilegal de instruções de SQL através do input do utilizador.

Para já, fica caracterizado que para haver SQL Injection, deve haver uma porta de entrada para os dados.
Se essa porta -Web form- existir, então a acção de um malicious user consistirá em executar comandos de SQL contra a Base de Dados da aplicação.

Da análise do código em causa, o que realmente importa destacar é o seguinte:

1) Não obedece a nenhum Design Pattern
Spaghetti à parte, concretamente, não há best pratices aqui. Penso que este facto contribui negativamente para a Aplicação na qual este código está inserido. É o que caracteriza a verdadeira ameaça, no âmbito da Arquitectura.

2) Existe um ponto de entrada.
A função insertDoc() despoleta todo o fluxo de informação neste contexto, e os seus parâmetros são, ou deveriam ser, inputs do utilizador. Por exemplo: Centro, Produto e Quantidade.

3) A query sql é @parametrizada.
Aqui está o ponto chave de toda a questão! Esta é a primeira linha de defesa contra o ataque SQL Injection.

Ok. Ao observarmos o ponto nº 2, há algo que devemos nos preocupar: "existe uma porta!"

Rule of thumb
-------------
"Não confie no input do utilizador!"

Na prática, isto significa validar os inputs do utilizador contra tipo, comprimento, formato, etc.

E, em relação ao ponto nº 3!? O que é esta cena de parametrizada?

"The best way to mitigate SQL Injection attacks is to use parameterized SQL queries."

Eu deixei esta sentença na sua forma original, ou seja, em inglês, porque isto é o statement dos Experts. Ou seja, a Microsoft, por exemplo.

Isto quer dizer, na prática, que ao utilizar queries parametrizadas, na verdade, o valor introduzido pelo utilizador está a ser tratado como uma literal e, não, como código executável.
E, ainda, este valor é confrontado com o seu tipo e comprimento. Qualquer coisa fora do que foi definido irá provocar uma excepção. No nosso caso, por exemplo:

declare @Centro as char(3);
declare @produto as char(2);
declare @quantidade as int;

Claro! Melhor seria se isto acontecesse em uma Stored Procedure! Se assim não o for e, ao nível do código .Net, podemos utilizar SQLParameter!

Para concluir, eu sintetizei aqui, um assunto que é muito mais abrangente do que isto. O objectivo foi demonstrar o porquê da minha ideia de que não é possível realizar o ataque SQL Injection com base no código em discussão.

Assim, a minha opinião é:

"Não, não é possível utilizar o ataque SQL Injection com base neste código!"

Agora, "It's up to You!"

Até ao próximo post!

Fernando Oliveira
Agap2 Developer
MCPD - ASP.NET Developer 3.5

Sem comentários: