05/01/2024
SQL Injection é um ataque que permite a invasores modificar operações de banco de dados através de um aplicativo. Isso pode resultar em acesso indevido e manipulação de dados, incluindo a exclusão de tabelas ou alteração de senhas de usuários.
Aqui está um exemplo de código ASP.NET Core vulnerável a SQL Injection, com um parâmetro de URL:
// Exemplo de código ASP.NET Core vulnerável a SQL Injection
// Recebendo 'id' da URL
string id = HttpContext.Request.Query["id"];
// Montagem insegura da consulta
string query = $"SELECT * FROM users WHERE id = {id}";
using (var command = new SqlCommand(query, connection))
{
// Execução da consulta...
}
Este código é vulnerável porque usa diretamente um dado externo ('id' da URL) na consulta SQL. Por exemplo, se o parâmetro 'id' da URL for alterado para id=0; DROP TABLE users;
, a consulta se tornará SELECT * FROM users WHERE id = 0; DROP TABLE users;
, resultando na exclusão da tabela 'users' e perda de todos os dados.
Utilizar declarações parametrizadas é uma maneira eficiente de proteger seu código ASP.NET Core contra SQL Injection. Vamos aprimorar nosso código inicial com o uso de declarações parametrizadas:
// Protegendo o código com declarações parametrizadas
// Estabelecendo conexão
using (var connection = new SqlConnection("ConnectionString"))
{
// Garantindo que 'id' seja um número inteiro
int id = int.Parse(HttpContext.Request.Query["id"]);
// Preparando a consulta com named parameter
string query = "SELECT * FROM users WHERE id = @id";
using (var command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@id", id);
// Executando a consulta com um parâmetro seguro
var reader = command.ExecuteReader();
// Código para manipulação dos resultados...
}
}
Ao converter o 'id' para um inteiro e utilizar uma declaração parametrizada, garantimos que apenas valores seguros sejam usados na consulta.
Além de usar declarações parametrizadas, é essencial validar os dados de entrada para garantir que atendam aos critérios esperados (como tipo e formato). Esta prática adiciona uma camada extra de segurança.
Stored Procedures no SQL Server são outra forma eficaz de prevenir SQL Injection. Ao encapsular a lógica SQL dentro do banco de dados, eles reduzem a exposição à injeção de SQL.
// Usando Stored Procedures
using (var connection = new SqlConnection("ConnectionString"))
{
using (var command = new SqlCommand("uspGetUserById", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@Id", id);
// Executando a consulta segura
var reader = command.ExecuteReader();
// Código para manipulação dos resultados...
}
}
Proteger seu código ASP.NET Core contra SQL Injection é fundamental para garantir a segurança de suas aplicações. Neste artigo, abordamos técnicas para evitar essa vulnerabilidade, incluindo o uso de declarações parametrizadas, validação de entrada e o uso de Stored Procedures.
Lembre-se sempre de validar e tratar os dados de entrada, evitando concatenação direta em consultas SQL. A segurança de suas aplicações depende dessas práticas, evitando potenciais ataques e prejuízos.