Segurança de aplicações C#: top 10 vulnerabilidades que todo desenvolvedor deve conhecer
Desenvolver em C# e na plataforma .NET é uma ferramenta poderosa para criar aplicações corporativas e web. No entanto, mesmo o código mais confiável pode conter brechas que levam a vazamento de dados, perda de reputação e prejuízos financeiros. Neste artigo, analisaremos as 10 vulnerabilidades mais comuns em aplicações C#, baseadas no OWASP Top 10, com exemplos práticos e formas de proteção.
1. Injeção de SQL (SQL Injection)
Esta é uma das ameaças mais antigas, mas ainda atual. A vulnerabilidade ocorre quando a entrada do usuário é concatenada diretamente em uma consulta SQL.
Código vulnerável:
string userName = Request.QueryString["name"];string query = "SELECT * FROM Users WHERE Name = '" + userName + "'";SqlCommand cmd = new SqlCommand(query, connection);Código seguro (consultas parametrizadas):
string userName = Request.QueryString["name"];string query = "SELECT * FROM Users WHERE Name = @name";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@name", userName);Recomendação: Sempre use consultas parametrizadas ou Entity Framework, que escapa automaticamente a entrada.
2. Cross-Site Scripting (XSS)
Os ataques XSS permitem que um invasor insira um script malicioso em uma página web. Em C#, isso ocorre frequentemente ao exibir dados não validados através de @Html.Raw().
Código vulnerável:
@Html.Raw(Model.Comment)Código seguro (codificação de saída):
@Html.Encode(Model.Comment)Recomendação: Use a sintaxe Razor @Model.Comment (que codifica HTML automaticamente) e nunca utilize @Html.Raw() sem validação.
3. Cross-Site Request Forgery (CSRF)
CSRF força um usuário autenticado a executar uma ação indesejada no site (por exemplo, transferir dinheiro). No ASP.NET Core, a proteção é incorporada, mas precisa ser ativada corretamente.
Código vulnerável (ausência de token antifalsificação):
<form method="post" action="/Account/Delete"> <button type="submit">Deletar conta</button></form>Código seguro (com AntiForgeryToken):
<form method="post" action="/Account/Delete"> @Html.AntiForgeryToken() <button type="submit">Deletar conta</button></form>Recomendação: Adicione o atributo [ValidateAntiForgeryToken] aos seus métodos POST e use @Html.AntiForgeryToken() nos formulários.
4. Armazenamento inseguro de senhas
Armazenar senhas em texto simples ou usando hashes fracos (MD5, SHA1) é um erro grave.
Código vulnerável:
string passwordHash = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(password));Código seguro (usando bcrypt/Argon2):
using BCrypt.Net;string passwordHash = BCrypt.HashPassword(password, workFactor: 12);Recomendação: Use bibliotecas como BCrypt.Net ou Microsoft.AspNetCore.Identity, que geram salt automaticamente e utilizam algoritmos modernos.
5. Exposição de dados confidenciais em exceções
Exibir o stack trace completo para o usuário pode revelar a estrutura da aplicação, strings de conexão e caminhos de arquivos.
Código vulnerável (em produção):
catch (Exception ex){ return Content(ex.ToString());}Código seguro:
catch (Exception ex){ _logger.LogError(ex, "Erro ao processar a solicitação"); return StatusCode(500, "Erro interno do servidor");}Recom ```