Esta página foi útil?
Seus comentários sobre este conteúdo são importantes. Queremos saber sua opinião.
Comentários adicionais?
1500 caracteres restantes
Exportar (0) Imprimir
Expandir Tudo
Expandir Minimizar

ASP.Net - Usando parameter ao invés de aspas

Mauricio Junior

Dn592109.060DE5057573180CEC6D227C6D3E2207(pt-br,MSDN.10).png

Janeiro, 2014

Caro(a) Leitor(a), hoje eu vou mostrar e explicar como enviar comandos para o banco de dados da maneira correta, ou seja, evitando o inject SQL e invasões em seu sistema ou site. Quando o desenvolvedor usa aspas duplas ou simples, o usuário mal intencionado pode colocar parâmetros em seus campos que anulam sua pesquisa, login e muito mais, por exemplo: Se na tela do seu site tem o campo de usuário, senha e o botão para entrar em uma área restrita; qualquer usuário pode colocar aspas simples e duplas como ‘x=x’ onde anulam o select com where.

Ao invés de pesquisar pelo usuário e senha no banco de dados, o select vai verificar se x é igual a x, cujo muitas vezes autentica. O mesmo comando pode acontecer com o campo de senha.

Utilizado:

  • Ferramenta Visual Studio
  • Linguagem C#
  • Plataformas: ASP.NET e Desktop

Comando do básico, veja o diagrama 1 de um sistema imaginário.

Veja o diagrama abaixo:

Dn592109.D91C6B3F8021C42E3EFEDF928EE84CEF(pt-br,MSDN.10).png

Imagem 1 – Diagrama

Imagine que o seu site esteja utilizando essas camadas desenhadas na imagem 1. Temos o layout caracterizado pela primeira camada, temos a camada de regra de negócio e a camada de dados que acessa o banco de dados.

O “parameter” que estou falando hoje está na camada de dados responsável por acessar o banco de dados. Note que nenhuma outra camada acessa o banco de dados a não ser a camada de acesso a dados.

Na camada layout existem dois campos do tipo TextBox que precisam de preenchimento, como por exemplo usuário e senha. Depois de preenchido, os dados são enviados e passam de camada a camada até chegarem na de dados. Ocomando SQL é preparado com o objetivo de enviar os dados para o banco de dados, pode ser SQL Server, Oracle, MySQL ou outros existentes no mercado.

Se na camada de dados, o desenvolvedor preparar o SELECT usando aspas simples, o código pode sofre grande perigo na mão de usuários mal intecionados. A listagem 1 mostra um exemplo simples usando aspas simples, dentro da camada de dados.

Listagem 1 – SELECT usando aspas simples.

Private DataSet SelecionUsuario(string _email, string _senha)
{
conectaBanco();
string sql = "SELECT Nome, Email, Usuario FROM Usuarios WHERE Email = ‘” + _email + “’ AND Senha = ‘” + _senha + “’”
SqlCommand sqlc = new SqlCommand(sql);
sqlc.CommandType = CommandType.Text;

DataSet dtSet = new DataSet();
SqlDataAdapter dtAdapter = new SqlDataAdapter(sqlc);
dtAdapter.Fill(dtSet);
return dtSet;
}

O método na listagem 1 é bem simples e não muito legal. Passar parâmetros como mostrado no método pode ser não muito bom, seria melhor passar uma classe ao invés de parâmetros separados.. Note que a “string” sql possui duas condições, a primeira com e-mail e a segunda com a senha. A listagem 2 mostra o que a maioria dos desenvolvedores fazem na condição do WHERE antes de processar no banco de dados.

Listagem 2 – Condição com aspas.

  • Where Email=’” + _email + “’ AND Senha = ‘” + _senha + “’”

Esse comando deve ser feito de forma diferente. Usar aspas está fora do padrão de segurança. Se você usar de maneira diferente, outra dica é; mude mais rápido possível. Não só na linguagem C# e sim em todas as linguagens disponíveis. Dentro das aspas são passados os valores vindos do método, ou seja, o valor que o usuário digitou na variável “_email” e “_senha”.

O resto do código está comum, usado por muitos desenvolvedores da linguagem C#. O grande problema é a condição do SELECT enviado para o banco de dados

A segunda dica aqui é a utilização de @ no lugar dos parâmetros com aspas, veja a listagem 3.

Listagem 3 – Trocando aspas por arroba.

Where Email= @email + AND Senha = @senha

A diferença da listagem 2 para a listagem 3 é o uso do arroba no lugar de aspas e os valores não são passados no comando SELECT, são passados em outro momento e antes de enviar para o banco de dados. Existem várias maneiras de atribuir parâmetros e valores, seguem duas maneiras.

Listagem 4 – Atribuindo valores com SQLParameter

sqlc.Parameters.Add(new SqlParameter("@email", _email));
sqlc.Parameters.Add(new SqlParameter("@senha", _senha));

Note que na listagem 4, o parâmetro @email foi atribuído com o valor _email que veio na assinatura do método. O mesmo passo aconteceu com o parâmetro senha. Essa é uma maneira de utilizar parameter. A variável sqlc é SQLCommand. A segunda maneira possui mais detalhes como identificação de cada informação. Listagem 5.

Listagem 5 – Outra maneira usando SQLParameter

IDataParameter param1 = new SqlParameter();
param1.ParameterName = "@email";
param1.Value = _email;
param1.DbType = System.Data.DbType.String;
sqlc.Parameters.Add(param1);

IDataParameter param2 = new SqlParameter();
param2.ParameterName = "@senha";
param2.Value = _senha;
param2.DbType = System.Data.DbType.String;
sqlc.Parameters.Add(param2);

Para definir os parâmetros, usamos o objeto “IDataParameter” onde é definido o nome, valor e tipo. No final, os parâmetros são atribuídos no SQL Command. Usando uma das duas maneiras, se o usuário fizer alguma passagem de parâmetro com aspas simples ou duplas, o site não terá problema algum.

A melhor maneira para criar o método mostrado na listagem 1 é colocar “parameter” e não aspas. Segue a listagem 6 para melhor entendimento.

Private DataSet SelecionUsuario(string _email, string _senha){
conectaBanco();
string sql = "SELECT Nome, Email, Usuario FROM Usuarios WHERE Email = @email AND Senha = @senha”;
SqlCommand sqlc = new SqlCommand(sql);
sqlc.CommandType = CommandType.Text;
IDataParameter param1 = new SqlParameter();
param1.ParameterName = "@email";
param1.Value = _email;
param1.DbType = System.Data.DbType.String;
sqlc.Parameters.Add(param1);

IDataParameter param2 = new SqlParameter();
param2.ParameterName = "@senha";
param2.Value = _senha;
param2.DbType = System.Data.DbType.String;
sqlc.Parameters.Add(param2);
DataSet dtSet = new DataSet();
SqlDataAdapter dtAdapter = new SqlDataAdapter(sqlc);
dtAdapter.Fill(dtSet);
return dtSet;
}

Bom, espero que tenha entendido o que foi falado aqui. Eu fico por aqui, utilize sempre está dica em seus sites ou aplicativos e procure não deixar brecha de segurança. Qualquer dúvida pode entrar em contato pelo site www.mauriciojunior.org.

Mostrar:
© 2015 Microsoft