Seguridad de aplicaciones C#: top 10 vulnerabilidades para principiantes

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 para principiantes

\n\n

Desarrollar aplicaciones seguras en C# no es solo una tendencia, sino una necesidad. Cada día se descubren miles de vulnerabilidades en el mundo, y tu aplicación podría ser el próximo objetivo. En este artículo analizaremos las 10 vulnerabilidades más comunes en aplicaciones C# (.NET) que enfrentan los desarrolladores principiantes. Aprenderás cómo detectarlas y, lo más importante, cómo proteger tu código.

\n\n

1. Inyección SQL (SQL Injection)

\n\n

La vulnerabilidad más antigua y aún peligrosa. Ocurre cuando la entrada del usuario se inserta directamente en una consulta SQL.

\n\n

Código vulnerable:

\n
string userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = '" + userName + "'";\nSqlCommand cmd = new SqlCommand(query, connection);
\n\n

Protección: Usa consultas parametrizadas o Entity Framework.

\n
string userName = Request["username"];\nstring query = "SELECT * FROM Users WHERE Name = @name";\nSqlCommand cmd = new SqlCommand(query, connection);\ncmd.Parameters.AddWithValue("@name", userName);
\n\n

2. Cross-Site Scripting (XSS)

\n\n

Los ataques XSS permiten a un atacante inyectar un script malicioso en una página que se muestra a otros usuarios.

\n\n

Código vulnerable:

\n
string comment = Request["comment"];\nResponse.Write("<div>" + comment + "</div>");
\n\n

Protección: Siempre codifica la salida. Usa HttpUtility.HtmlEncode():

\n
string comment = Request["comment"];\nResponse.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");
\n\n

3. Falta de autenticación y autorización

\n\n

Muchos principiantes olvidan verificar los permisos de acceso a los recursos. Por ejemplo, un usuario podría acceder al perfil de otro simplemente cambiando el ID en la URL.

\n\n

Código vulnerable:

\n
public IActionResult Profile(int userId)\n{\n    var user = _context.Users.Find(userId);\n    return View(user);\n}
\n\n

Protección: Siempre verifica que el usuario actual tenga derecho al recurso solicitado:

\n
public IActionResult Profile(int userId)\n{\n    var currentUserId = User.FindFirst(ClaimTypes.NameIdentifier).Value;\n    if (userId != currentUserId) return Forbid();\n    var user = _context.Users.Find(userId);\n    return View(user);\n}
\n\n

4. Fuga de datos confidenciales a través de excepciones

\n\n

Los desarrolladores suelen mostrar información completa de errores, incluyendo la traza de pila y cadenas de conexión.

\n\n

Código vulnerable:

\n
try\n{\n    // código\n}\ncatch (Exception ex)\n{\n    Response.Write(ex.ToString()); // ¡PELIGROSO!\n}
\n\n

Protección: En producción, usa mensajes de error genéricos y registra los detalles en un lugar seguro:

\n
try\n{\n    // código\n}\ncatch (Exception ex)\n{\n    _logger.LogError(ex, "Error al procesar la solicitud");\n    return StatusCode(500, "Ocurrió un error interno del servidor");\n}
\n\n

5. Almacenamiento inseguro de contraseñas

\n\n

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

\n\n

Código vulnerable:

\n
string passwordHash = MD5.Hash(password); // ¡NO SE DEBE HACER!
\n\n

Protección: Usa algoritmos modernos de hash con sal, como BCrypt o ASP.NET Core Identity:

\n
var passwordHasher = new PasswordHasher<IdentityUser>();\nstring passwordHash = passwordHasher.HashPassword(user, password);
\n\n

6. Protección insuficiente contra CSRF (Cross-Site Request Forgery)

\n\n

Ataque en el que un atacante obliga al navegador de la víctima a realizar una acción no deseada en otro sitio, donde

Blogs

Book Recommendations