Seguridad de aplicaciones C#: top 10 vulnerabilidades en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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.Json o Newtonsoft.Json con restricción de tipos.
  • Active TypeNameHandling.None.
  • Evite BinaryFormatter, SoapFormatter y LosFormatter.


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.Net o

Blogs

Book Recommendations