Top 10 vulnerabilidades de aplicaciones C# y cómo evitarlas

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 que todo desarrollador debe conocer



Desarrollar en C# y la plataforma .NET es una herramienta poderosa para crear aplicaciones empresariales y web. Sin embargo, incluso el código más robusto puede contener brechas que provoquen filtraciones de datos, pérdida de reputación y pérdidas financieras. En este artículo, analizaremos las 10 vulnerabilidades más comunes en aplicaciones C#, basadas en OWASP Top 10, con ejemplos prácticos y formas de protección.



1. Inyección SQL (SQL Injection)



Esta es una de las amenazas más antiguas, pero sigue siendo relevante. La vulnerabilidad surge cuando la entrada del usuario se concatena directamente en una consulta SQL.



Código vulnerable:

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);


Recomendación: Utilice siempre consultas parametrizadas o Entity Framework, que escapa automáticamente la entrada.



2. Cross-Site Scripting (XSS)



Los ataques XSS permiten a un atacante inyectar un script malicioso en una página web. En C#, esto ocurre a menudo al mostrar datos no validados a través de @Html.Raw().



Código vulnerable:

@Html.Raw(Model.Comment)


Código seguro (codificación de salida):

@Html.Encode(Model.Comment)


Recomendación: Use la sintaxis Razor @Model.Comment (que codifica HTML automáticamente) y nunca utilice @Html.Raw() sin verificación.



3. Cross-Site Request Forgery (CSRF)



CSRF obliga a un usuario autenticado a realizar una acción no deseada en el sitio (por ejemplo, transferir dinero). En ASP.NET Core, la protección está integrada, pero debe activarse correctamente.



Código vulnerable (sin token antifalsificación):

<form method="post" action="/Account/Delete">    <button type="submit">Eliminar cuenta</button></form>


Código seguro (con AntiForgeryToken):

<form method="post" action="/Account/Delete">    @Html.AntiForgeryToken()    <button type="submit">Eliminar cuenta</button></form>


Recomendación: Agregue el atributo [ValidateAntiForgeryToken] a sus métodos POST y use @Html.AntiForgeryToken() en los formularios.



4. Almacenamiento inseguro de contraseñas



Almacenar contraseñas en texto plano o usando hashes débiles (MD5, SHA1) es un grave error.



Código vulnerable:

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);


Recomendación: Utilice las bibliotecas BCrypt.Net o Microsoft.AspNetCore.Identity, que generan automáticamente una sal y utilizan algoritmos modernos.



5. Exposición de datos confidenciales en excepciones



Mostrar el stack trace completo al usuario puede revelar la estructura de la aplicación, cadenas de conexión y rutas de archivos.



Código vulnerable (en producción):

catch (Exception ex){    return Content(ex.ToString());}


Código seguro:

catch (Exception ex){    _logger.LogError(ex, "Error al procesar la solicitud");    return StatusCode(500, "Error interno del servidor");}


Recom

Blogs

Book Recommendations