Seguridad de aplicaciones C#: Top 10 vulnerabilidades para principiantes
La seguridad del software es una de las tareas clave del desarrollador. Incluso una aplicación pequeña en C# puede convertirse en un objetivo para los atacantes si no se tienen en cuenta las vulnerabilidades comunes. En este artículo, analizaremos las 10 vulnerabilidades más peligrosas de C# (.NET) que enfrentan los desarrolladores principiantes. Aprenderá cómo surgen, cómo se explotan y, lo más importante, cómo protegerse de ellas.
1. Inyección SQL (SQL Injection)
Esta es una de las vulnerabilidades más antiguas y peligrosas. Ocurre cuando la entrada del usuario se concatena directamente en una consulta SQL.
Ejemplo de código vulnerable:
string userName = Request.QueryString["user"];string query = "SELECT * FROM Users WHERE Name = '" + userName + "'";SqlCommand cmd = new SqlCommand(query, connection);Cómo atacan: Un atacante puede pasar al parámetro user el valor ' OR 1=1 --, lo que devolverá todos los registros de la tabla.
Protección: Utilice consultas parametrizadas.
string query = "SELECT * FROM Users WHERE Name = @userName";SqlCommand cmd = new SqlCommand(query, connection);cmd.Parameters.AddWithValue("@userName", userName);2. Cross-Site Scripting (XSS)
La vulnerabilidad XSS permite inyectar código JavaScript malicioso en una página que se muestra a otros usuarios.
Ejemplo de código vulnerable (ASP.NET WebForms):
string comment = Request.Form["comment"];Response.Write("<div>" + comment + "</div>");Protección: Siempre codifique la salida. Utilice HttpUtility.HtmlEncode() o la sintaxis Razor (@), que codifica automáticamente los datos.
Response.Write("<div>" + HttpUtility.HtmlEncode(comment) + "</div>");3. Deserialización insegura
Al deserializar datos de una fuente no confiable (por ejemplo, de una solicitud o archivo), un atacante puede ejecutar código arbitrario en el servidor.
Ejemplo de código vulnerable (BinaryFormatter):
BinaryFormatter formatter = new BinaryFormatter();using (var stream = new MemoryStream(data)){ var obj = formatter.Deserialize(stream); // ¡PELIGROSO!}Protección: Utilice serializadores modernos (JSON, XML con restricciones), verifique los tipos y nunca deserialice datos de clientes no confiables. Evite BinaryFormatter, SoapFormatter y LosFormatter.
4. Deficiencias en la autenticación y gestión de sesiones
Esto incluye contraseñas débiles, falta de límite en el número de intentos de inicio de sesión, cookies de sesión no protegidas.
Ejemplo de vulnerabilidad: Cookie de sesión sin las banderas HttpOnly y Secure.
Protección:
- Utilice
IdentityoASP.NET Core Identity. - Configure la cookie:
HttpOnly,Secure,SameSite=Strict. - Active el límite en el número de intentos de inicio de sesión (Account Lockout).
- Utilice HTTPS.
services.ConfigureApplicationCookie(options =>{ options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Strict;});5. Cross-Site Request Forgery (CSRF)
Un ataque en el que un atacante obliga a un usuario autenticado a realizar una acción no deseada en el sitio (por ejemplo, transferir dinero).
Protección: Utilice tokens antifalsificación (Anti-Forgery Tokens). En ASP.NET Core esto se hace automáticamente al usar la etiqueta <form> con asp-antiforgery.