Segurança de aplicações C#: top 10 vulnerabilidades na prática
A segurança é um dos componentes mais importantes no desenvolvimento de aplicações modernas em C# e .NET. Mesmo um pequeno bug negligenciado pode levar ao vazamento de dados ou à completa comprometimento do sistema. Neste artigo, abordaremos as 10 vulnerabilidades mais comuns que os desenvolvedores C# enfrentam e mostraremos como evitá-las na prática.
1. SQL Injection
A vulnerabilidade mais antiga e perigosa. Ocorre quando a entrada do usuário é inserida diretamente em uma consulta SQL.
Código vulnerável:
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = '" + login + "'";SqlCommand cmd = new SqlCommand(query, connection);Código seguro (consultas parametrizadas):
string login = txtLogin.Text;string query = "SELECT * FROM Users WHERE Login = @login";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@login", login);Proteção adicional: use ORM (Entity Framework) — ele parametriza consultas automaticamente.
2. Cross-Site Scripting (XSS)
Um invasor insere código JavaScript malicioso na página através da entrada do usuário.
Código vulnerável:
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");Código seguro (codificação da saída):
string comment = Request.Form["comment"];Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");No ASP.NET Core, use @Html.Encode() ou a sintaxe Razor com codificação automática.
3. Cross-Site Request Forgery (CSRF)
Ataque em que o invasor força o usuário a executar uma ação indesejada em um site onde ele está autenticado.
Código vulnerável (sem proteção):
[HttpPost]public IActionResult DeleteAccount(int userId){ // Exclusão de conta sem verificação de token return Ok();}Proteção com tokens antiforjamento no ASP.NET Core:
[HttpPost][ValidateAntiForgeryToken]public IActionResult DeleteAccount(int userId){ // Exclusão segura return Ok();}No cliente, o token é transmitido através de um campo oculto de formulário ou cabeçalho.
4. Desserialização insegura
Ao desserializar dados de uma fonte não confiável, um invasor pode executar código arbitrário.
Código vulnerável (BinaryFormatter):
BinaryFormatter formatter = new BinaryFormatter();using (FileStream fs = new FileStream("data.bin", FileMode.Open)){ var obj = formatter.Deserialize(fs); // Perigoso!}Alternativas seguras:
- Use
System.Text.JsonouNewtonsoft.Jsoncom restrição de tipos. - Ative
TypeNameHandling.None. - Evite
BinaryFormatter,SoapFormattereLosFormatter.
5. Falhas de autenticação e gerenciamento de sessão
Autenticação fraca, armazenamento de senhas em texto claro, tokens de sessão previsíveis.
Erros:
- Armazenamento de senha em texto claro:
User.Password = txtPassword.Text; - Implementação própria de hash sem salt.
- Uso de
Guid.NewGuid()para gerar tokens — muito previsível.
Abordagem correta:
- Use
ASP.NET Core Identity— solução integrada. - Faça hash de senhas com
BCrypt.Netou