Seguridad de aplicaciones Java: Top 10 vulnerabilidades para principiantes
Java sigue siendo uno de los lenguajes de programación más populares para crear aplicaciones empresariales y web. Sin embargo, como cualquier otro lenguaje, es susceptible a ataques. Para los desarrolladores principiantes, comprender los fundamentos de la seguridad no es solo una buena práctica, sino una habilidad vital. En este artículo, analizaremos las 10 vulnerabilidades más comunes en aplicaciones Java, proporcionaremos ejemplos de código y explicaremos cómo proteger su proyecto.
1. Inyección SQL (SQL Injection)
Esta es una de las vulnerabilidades más antiguas y peligrosas. Ocurre cuando la entrada del usuario se inserta directamente en una consulta SQL sin procesamiento previo.
Ejemplo de código vulnerable:
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";Statement stmt = connection.createStatement();ResultSet rs = stmt.executeQuery(query);Un atacante puede pasar un valor como ' OR '1'='1 en userInput, lo que provocará que se devuelvan todos los datos de la tabla.
Cómo protegerse: Utilice siempre PreparedStatement.
String query = "SELECT * FROM users WHERE username = ?";PreparedStatement pstmt = connection.prepareStatement(query);pstmt.setString(1, userInput);ResultSet rs = pstmt.executeQuery();2. Cross-Site Scripting (XSS)
Los ataques XSS permiten inyectar un script malicioso en una página web que luego se ejecuta en el navegador de la víctima. Los servlets Java y JSP a menudo son víctimas de esta vulnerabilidad si no escapan la salida.
Ejemplo de código vulnerable:
out.println("<p>Hola, " + request.getParameter("name") + "</p>");Cómo protegerse: Escape los caracteres HTML o utilice motores de plantillas modernos (por ejemplo, Thymeleaf o JSP con JSTL).
// Usamos la librería Apache Commons LangString safeInput = StringEscapeUtils.escapeHtml4(userInput);out.println("<p>Hola, " + safeInput + "</p>");3. Cross-Site Request Forgery (CSRF)
CSRF obliga a un usuario a realizar una acción no deseada en un sitio web donde está autenticado. Por ejemplo, transferir dinero o cambiar la contraseña.
Ejemplo de vulnerabilidad:
<img src="https://bank.com/transfer?amount=1000&to=hacker" />Cómo protegerse: Utilice tokens CSRF. En Spring Security, esto se hace automáticamente al habilitar la protección.
// Habilitamos la protección CSRF en Spring Securityhttp.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());4. Deserialización insegura
Java permite reconstruir objetos a partir de flujos de bytes. Si un atacante puede pasar un objeto serializado malicioso, esto puede provocar la ejecución de código arbitrario.
Ejemplo de código vulnerable:
ObjectInputStream ois = new ObjectInputStream(request.getInputStream());Object obj = ois.readObject(); // Operación potencialmente peligrosaCómo protegerse:
- No deserialice datos de fuentes no confiables.
- Utilice listas blancas de clases.
- Utilice alternativas como JSON (Jackson/Gson) con validación.
5. Vulnerabilidades en librerías (Dependency Vulnerabilities)
Los proyectos Java modernos utilizan docenas de librerías de terceros (Maven, Gradle). Las versiones desactualizadas o vulnerables son una causa común de ataques.
Cómo protegerse:
- Actualice las dependencias regularmente.
- Utilice herramientas de análisis: OWASP Dependency-Check, Snyk, GitHub Dependabot.
- Agregue verificaciones en el pipeline de CI/CD.
6. Autenticación insegura y gestión de sesiones
Débil