Aula 49 - Execução de Comandos DML e Prevenção contra SQL Injection

Com a conexão estabelecida e protegida, o próximo passo é enviar instruções SQL DML (INSERT, UPDATE, DELETE) da aplicação para o SGBD. Em C#, utilizamos a classe SqlCommand; em Java, utilizamos a interface PreparedStatement.

No entanto, a forma como os dados digitados pelo usuário são integrados ao comando SQL determina a segurança de toda a aplicação. Uma prática altamente perigosa e incorreta é a concatenação de strings para montar o comando SQL:

// EXEMPLO INCORRETO E VULNERÁVEL (NÃO UTILIZAR): string sql = "INSERT INTO Usuarios (nome, senha) VALUES ('" +
txtNome.Text + "', '" + txtSenha.Text + "')";

Essa abordagem abre uma vulnerabilidade grave conhecida como SQL Injection (Injeção de SQL). Se um usuário mal-intencionado digitar no campo de senha o texto ' OR '1'='1, a instrução enviada ao SGBD será alterada dinamicamente, permitindo burlar a autenticação ou até mesmo executar comandos destrutivos como DROP TABLE. Para eliminar 100% o risco de SQL Injection, a boa prática de engenharia obriga o uso de Consultas Parametrizadas (Parameterized Queries). Nas consultas parametrizadas, o comando SQL é escrito utilizando marcadores de posição (parâmetros, como @nome no C# ou ? no Java), e os valores são atribuídos separadamente através de métodos específicos do objeto de comando: 

Exemplo Seguro em C# (ADO.NET):

string sql = "INSERT INTO Produtos (nome_produto,
preco_unitario) VALUES (@nome, @preco)"; using (SqlCommand cmd = new SqlCommand(sql, conexao)) { // Atribuição segura de parâmetros cmd.Parameters.AddWithValue("@nome", txtNome.Text); cmd.Parameters.AddWithValue("@preco", double.Parse(txtPreco.Text)); conexao.Open(); int linhasAfetadas = cmd.ExecuteNonQuery(); // Executa o
DML e retorna a quantidade de linhas alteradas }

O método ExecuteNonQuery() é utilizado para comandos DML (INSERT, UPDATE, DELETE) que não retornam conjuntos de dados (tabelas), retornando um número inteiro que representa exatamente a quantidade de linhas afetadas pela operação no banco de dados.

Comentários

Postagens mais visitadas deste blog

Aula 42 - Linguagem SQL: Comandos DDL (CREATE, ALTER, DROP)

Aula 44 - Linguagem SQL: Consultas com SELECT e Cláusulas de Filtro

Aula 47 - Conectividade em Java com JDBC – DriverManager e Connection