Saudações a todos. Hoje explico a vocês como aumentar segurança em autenticação, SQL Injection é uma brecha grave na segurança que toda via deve obrigatóriamente tratada, dificultando assim o acesso de usuários nao cadastrados.
Para este exemplo será necessário:
* SQL SERVER :
* Criar um Banco de Dados (dbTeste);
* Criar uma Tabela (tbLogin), abaixo script da tabela;
* Inserir um usuario e uma senha;
* Visual Studio :
* Criar um novo Web Site
* Digitar código na pagina Default.ASPX e Default.ASPX.CS
* No arquivo Default.ASPX.CS configurar linha de conexão com banco de dados, segundo sua realidade.
* Forma de Testar
* 1º Teste, informe o login e senha cadastrados no banco e teste com as duas formas de conexao;
* 2º Teste, no campo login digite ‘ or 1=1 — e teste com as duas forma de conexao;
nesta forma será efetuado a autenticação com SQL Injection, pois como pode notar eu insiro uma aspas simples
esta tem a função de fechar a primeira aspas simples aberta na instrução sql o restante (OR 1=1 –)faz retornar sempre uma
condição verdadeira e os dois sinais de menos, cancelam o restante da linha;
Eis abaixo o código da aplicação:
* SQL SERVER : Criar Tabela tbLogin USE [dbTestes] GO /****** Object: Table [dbo].[tbLogin] Script Date: 02/19/2009 17:54:36 ******/ CREATE TABLE [dbo].[tbLogin] ( [Login] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, [Senha] [varchar](50) COLLATE Latin1_General_CI_AS NOT NULL, CONSTRAINT [PK_tbLogin] PRIMARY KEY CLUSTERED ( [Login] ASC ) WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO * Visual Studio: -- DEFAULT.ASPX-- DEFAULT.ASPX;CS using System.Data; using System.Data.SqlClient; protected void btLogin1_Click(object sender, EventArgs e) { /* Este representa o botao Login (SQL Injection) ou seja por este botao e´ permitido efetuar SQL Injection */ string cs = "Data Source=WXPRO-001\SQLEXPRESS;Initial Catalog=dbTestes;Integrated Security=True"; SqlConnection conn = new SqlConnection(cs); try { conn.Open(); string comando = "Select Count(*) From tbLogin where Login ='" + this.txtLogin.Text.ToString() + "' and Senha = '" + this.txtSenha.Text.ToString() + "'"; System.Data.SqlClient.SqlCommand comm = new SqlCommand(comando, conn); int nroUsuarios = Convert.ToInt32(comm.ExecuteScalar()); if (nroUsuarios > 0) { this.lblMsg.Text = "Usuario Autenticado!"; } else { this.lblMsg.Text = "Usuario Invalido!"; } } catch(Exception ex) { this.lblMsg.Text= ex.ToString(); } finally { conn.Close(); } } protected void btLogin2_Click(object sender, EventArgs e) { /* Este representa o botao Login (Don't SQL Injection) ou seja por este botao NAO e´ permitido efetuar SQL Injection. */ string cs = "Data Source=WXPRO-001\SQLEXPRESS;Initial Catalog=dbTestes;Integrated Security=True"; SqlConnection conn = new SqlConnection(cs); try { conn.Open(); // Aqui esta a diferenca, o conteudo dos campos serao passados por parametros // tratados pelo proprio FrameWork string comando = "Select Count(*) From tbLogin where Login =@Login and Senha = @Senha"; System.Data.SqlClient.SqlCommand comm = new SqlCommand(comando, conn); comm.Parameters.AddWithValue("@Login", this.txtLogin.Text); comm.Parameters.AddWithValue("@Senha", this.txtSenha.Text); int nroUsuarios = Convert.ToInt32(comm.ExecuteScalar()); if (nroUsuarios > 0) { this.lblMsg.Text = "Usuario Autenticado!"; } else { this.lblMsg.Text = "Usuario Invalido!"; } } catch (Exception ex) { this.lblMsg.Text = ex.ToString(); } finally { conn.Close(); } } -- // FIM