Seguridad de aplicaciones C#: top 10 vulnerabilidades y métodos de protección en .NET
Desarrollar aplicaciones seguras en C# y la plataforma .NET es una tarea críticamente importante para cualquier desarrollador. Incluso teniendo en cuenta los mecanismos de protección integrados, el framework no puede prevenir todos los ataques. En este artículo analizaremos las 10 vulnerabilidades más comunes en aplicaciones C#, basadas en el ranking actual OWASP Top 10, y mostraremos cómo evitarlas con ejemplos de código.
1. Inyección SQL (SQL Injection)
Una de las vulnerabilidades más antiguas y peligrosas. Ocurre cuando la entrada del usuario se concatena directamente en una consulta SQL.
Código vulnerable:
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. Cross-Site Scripting (XSS)
Ataque en el que un atacante inyecta un script malicioso en una página web. En ASP.NET Core es importante codificar la salida.
Código vulnerable (Razor):
<div>@Model.UserInput</div>Código seguro:
<div>@Html.Encode(Model.UserInput)</div>// O en ASP.NET Core use @Model.UserInput si no usa HtmlStringEn ASP.NET Core Razor codifica la salida por defecto, pero al usar @Html.Raw() o devolver ContentResult con datos no verificados, el riesgo regresa.
3. Cross-Site Request Forgery (CSRF)
Ataque en el que un atacante obliga a un usuario autenticado a realizar una acción no deseada.
Protección en ASP.NET Core:
// En ConfigureServicesservices.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");
// En el controlador[AutoValidateAntiforgeryToken]public class AccountController : Controller{ [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangePassword(ChangePasswordModel model) { // código }}4. Deserialización insegura
Vulnerabilidad peligrosa, especialmente al usar BinaryFormatter, SoapFormatter o Newtonsoft.Json con TypeNameHandling.All.
Código vulnerable:
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };var obj = JsonConvert.DeserializeObject(json, settings);Código seguro:
// Use System.Text.Json (seguro por defecto)var obj = JsonSerializer.Deserialize<MyType>(json);// O limite TypeNameHandling en Newtonsoftvar settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.None };5. Deficiencias de autenticación y gestión de sesiones
Incluye contraseñas débiles, falta de bloqueo de cuenta, cookies no protegidas.
Recomendaciones:
- Use ASP.NET Core Identity con políticas de contraseñas.
- Configure la protección de cookies:
HttpOnly,Secure,SameSite. - Active el bloqueo después de N intentos fallidos.
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. Exposición de datos sensibles
Almacenamiento de contraseñas en texto plano, transmisión de datos por HTTP, registro de secretos.
Código seguro:
// Hash de contraseñasvar passwordHasher = new PasswordHasher<User>();string hash = passwordHa