Seguridad de aplicaciones C#: top 10 vulnerabilidades en la práctica
La seguridad es uno de los componentes más importantes en el desarrollo de aplicaciones modernas con C# y .NET. Incluso un pequeño error pasado por alto puede provocar una fuga de datos o un compromiso total del sistema. En este artículo analizaremos las 10 vulnerabilidades más comunes que enfrentan los desarrolladores de C# y mostraremos cómo evitarlas en la práctica.
1. Inyección SQL (SQL Injection)
La vulnerabilidad más antigua y peligrosa. Ocurre cuando la entrada del usuario se inserta directamente en una consulta SQL.
Código vulnerable:
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);Protección adicional: use ORM (Entity Framework) — parametriza las consultas automáticamente.
2. Cross-Site Scripting (XSS)
Un atacante inyecta código JavaScript malicioso en la página a través de la entrada del usuario.
Código vulnerable:
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");Código seguro (codificación de salida):
string comment = Request.Form["comment"];Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");En ASP.NET Core use @Html.Encode() o sintaxis Razor con codificación automática.
3. Cross-Site Request Forgery (CSRF)
Ataque en el que un atacante obliga al usuario a realizar una acción no deseada en un sitio donde está autenticado.
Código vulnerable (sin protección):
[HttpPost]public IActionResult DeleteAccount(int userId){ // Eliminación de cuenta sin verificación de token return Ok();}Protección con tokens antifalsificación en ASP.NET Core:
[HttpPost][ValidateAntiForgeryToken]public IActionResult DeleteAccount(int userId){ // Eliminación segura return Ok();}En el cliente, el token se transmite mediante un campo oculto del formulario o un encabezado.
4. Deserialización insegura
Al deserializar datos de una fuente no confiable, un atacante puede ejecutar código arbitrario.
Código vulnerable (BinaryFormatter):
BinaryFormatter formatter = new BinaryFormatter();using (FileStream fs = new FileStream("data.bin", FileMode.Open)){ var obj = formatter.Deserialize(fs); // ¡Peligroso!}Alternativas seguras:
- Use
System.Text.JsonoNewtonsoft.Jsoncon restricción de tipos. - Active
TypeNameHandling.None. - Evite
BinaryFormatter,SoapFormatteryLosFormatter.
5. Deficiencias en autenticación y gestión de sesiones
Autenticación débil, almacenamiento de contraseñas en texto plano, tokens de sesión predecibles.
Errores:
- Almacenar la contraseña en texto plano:
User.Password = txtPassword.Text; - Implementación propia de hash sin sal.
- Usar
Guid.NewGuid()para generar tokens — demasiado predecible.
Enfoque correcto:
- Use
ASP.NET Core Identity— solución integrada. - Hashee las contraseñas con
BCrypt.Neto