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:
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 INCORRETO E VULNERÁVEL (NÃO UTILIZAR): string sql = "INSERT INTO Usuarios (nome, senha) VALUES ('" +
txtNome.Text + "', '" + txtSenha.Text + "')";
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.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 }

Comentários
Postar um comentário