sexta-feira, 26 de dezembro de 2008

SQL Injection

Na edição 57 da .NET Magazine, na coluna Quick Update eu falei um pouco sobre SQL Injection. Como esse é um dos grandes problemas de segurança em aplicações Web, vou falar sobre isso aqui no Blog também.


A melhor forma de entender o mau que o SQL Injection causa, é na prática. Sendo assim, crie um database de testes no seu SQL Server, e adicione uma tabela chamada Usuarios nele, como mostra o script SQL abaixo. (Em hipótese alguma faça esse exemplo em uma aplicação em Produção).


Em seguida inclua um Usuário qualquer nesta tabela para fazermos um teste de Login. Agora abra o Visual Studio, crie um WebSite qualquer e na página Default.aspx desenhe uma interface de Login simples, como mostra a figura abaixo.



No evento Click do Button, inclua o código que você encontra logo abaixo. Possivelmente você terá que fazer alguns ajustes, principalmente quanto à ConnectionString e os nomes dos controles.


Veja que este é um código bastante simples, e irá executar um comando SELECT para verificar a existência do usuário através do Login e Senha que foram informados nos TextBoxes. O resultado do comando é verificado e uma mensagem é exibida. Faça um teste simples para verificar se este código está funcionando. Veja se está autenticando corretamente os usuários cadastrados.

Agora que você sabe que este trecho de código funciona, como mostra a figura abaixo, informe no campo Login a seguinte string: ' or 1=1 -- e clique em Login.




Isso é SQL Injection! A forma como criamos o comando SELECT, através de concatenação de strings, permite este tipo de aberração. O comando que é executado neste caso é o seguinte:

Veja que esta pequena string informada no lugar do nome do usuário transforma completamente o comando SELECT. Esta parte da string: ' or 1=1 torna a condição WHERE sempre verdadeira, e os dois sinais de subtração ( -- ) tornam o restante do comando um simples comentário. O resultado é que temos um invasor autenticado no sistema.

Este é um exemplo simples do que é o SQL Injection, e do grande mal que ele pode causar nas suas aplicações. A solução para este problema é bastante simples, temos que fazer uso dos Paramêtros! Veja na Listagem abaixo como deve ficar o código de autenticação com os parâmetros.

Refaça os testes com o uso dos parâmetros, você verá que neste caso estamos salvos do SQL Injection.

Grande Abraço!

Nenhum comentário:

Postar um comentário