Segurança de aplicações C#: top 10 vulnerabilidades e métodos de proteção no .NET
Desenvolver aplicações seguras em C# e na plataforma .NET é uma tarefa criticamente importante para qualquer desenvolvedor. Mesmo considerando os mecanismos de proteção integrados, o framework não pode prevenir todos os ataques. Neste artigo, analisaremos as 10 vulnerabilidades mais comuns em aplicações C#, baseadas no ranking atual OWASP Top 10, e mostraremos como evitá-las com exemplos de código.
1. Injeção de SQL (SQL Injection)
Uma das vulnerabilidades mais antigas e perigosas. Ocorre quando a entrada do usuário é concatenada diretamente em uma consulta SQL.
Código vulnerável:
string query = "SELECT * FROM Users WHERE Username = '" + username + "'";SqlCommand cmd = new SqlCommand(query, connection);Código seguro (uso de consultas parametrizadas):
string query = "SELECT * FROM Users WHERE Username = @username";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@username", username);2. Scripting entre sites (XSS)
Ataque no qual o invasor insere um script malicioso em uma página web. No ASP.NET Core, é importante codificar a saída.
Código vulnerável (Razor):
<div>@Model.UserInput</div>Código seguro:
<div>@Html.Encode(Model.UserInput)</div>// Ou no ASP.NET Core use @Model.UserInput, se não estiver usando HtmlStringNo ASP.NET Core Razor, a saída é codificada por padrão, mas ao usar @Html.Raw() ou retornar ContentResult com dados não verificados, o risco retorna.
3. Falsificação de solicitação entre sites (CSRF)
Ataque no qual o invasor força um usuário autenticado a executar uma ação indesejada.
Proteção no ASP.NET Core:
// Em ConfigureServicesservices.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");
// No controller[AutoValidateAntiforgeryToken]public class AccountController : Controller{ [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangePassword(ChangePasswordModel model) { // código }}4. Desserialização insegura
Vulnerabilidade perigosa, especialmente ao usar BinaryFormatter, SoapFormatter ou Newtonsoft.Json com TypeNameHandling.All.
Código vulnerável:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };var obj = JsonConvert.DeserializeObject(json, settings);Código seguro:
// Use System.Text.Json (seguro por padrão)var obj = JsonSerializer.Deserialize<MyType>(json);// Ou restrinja TypeNameHandling no Newtonsoftvar settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };5. Falhas de autenticação e gerenciamento de sessão
Inclui senhas fracas, ausência de bloqueio de conta, cookies desprotegidos.
Recomendações:
- Use ASP.NET Core Identity com políticas de senhas.
- Configure a proteção de cookies:
HttpOnly,Secure,SameSite. - Ative o bloqueio após N tentativas falhas.
services.ConfigureApplicationCookie(options =>{ options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Strict; options.ExpireTimeSpan = TimeSpan.FromMinutes(30); options.SlidingExpiration = true;});6. Exposição de dados sensíveis
Armazenamento de senhas em texto puro, transmissão de dados via HTTP, registro de segredos em log.
Código seguro:
// Hash de senhasvar passwordHasher = new PasswordHasher<User>();string hash = passwordHa