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!

sábado, 13 de dezembro de 2008

NHibernate e ActiveWriter

Uma ferramenta Open Source de Mapeamento Objeto/Relacional (O/RM) muito popular no mundo JAVA é o Hibernate. Para .NET o pessoal do Hibernate criou o NHibernate, que faz o mapeamento entre classes modeladas no .NET com tabelas de bancos de dados relacionais.

São dois grandes benefícios que temos ao usar o NHibernate: 1. Com ele não precisamos criar os comandos SQL, pois eles são criados em tempo de execução. 2. Temos a possibilidade de criar aplicações que sejam compatíveis com N bancos de dados.

O problema do NHibernate é o aumento significativo de trabalho que temos, pois além da modelagem das classes, é necessário criar um arquivo XML de mapeamento para cada classe X tabela.

O ADO.NET Entity Framework (EF) da Microsoft veio esse ano como principal concorrente do NHibernate, e com o grande diferencial da produtividade, já que os mapeamentos podem ser feitos por uma ferramenta visual.

O problema é que o EF tem se mostrado uma ferramenta “não-madura”, basta ver as cartas de sugestões de melhorias, voto de desconfiança (
http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/), anuncio de nova versão com .NET 4.0, e o prematuro “falecimento” do LINQ to SQL. Tudo isso tem pesado muito na hora de escolher que ferramenta de O/RM utilizar.

Um ponto positivo para o NHibernate são algumas ferramentas “satélites” desenvolvidas pela própria comunidade. Uma que merece destaque é o ActiveWriter (
http://using.castleproject.org/display/Contrib/ActiveWriter).

O ActiveWriter é uma ferramenta que ao instalada permite que façamos a criação das classes e arquivos XML de mapeamento para NHibernate de forma visual. Além disso ele têm a capacidade de gerar as classes apenas arrastando as tabelas da Server Explorer, assim como fazemos com os Datasets tipados.

Se você está a procura de uma ferramenta de mapeamento, leve em conta o NHibernate com o ActiveWriter, você não vai se arrepender. Em breve será publicado um artigo meu na .NET Magazine explicando detalhadamente como utilizar o ActiveWriter com o NHibernate.

Grande Abraço!