Una aplicación web Java debe protegerse contra los ataques más habituales. Esta sección cubre los vectores de ataque más frecuentes y cómo mitigarlos.
Cross-Site Scripting (XSS)
El XSS ocurre cuando la aplicación incluye datos del usuario en la respuesta HTML sin escaparlos. Siempre escapa la salida:
// En Servlet: escapar manualmente
import org.apache.commons.text.StringEscapeUtils;
String valorSeguro = StringEscapeUtils.escapeHtml4(valorUsuario);
// En JSP: JSTL c:out escapa automáticamente
<c:out value="${datosUsuario}"/>
// NUNCA usar esto con datos de usuario:
out.println("<p>" + req.getParameter("nombre") + "</p>"); // VULNERABLE
SQL Injection
Usa siempre PreparedStatement. Nunca concatenes parámetros en la query SQL (se trata en detalle en el tutorial de JDBC):
// VULNERABLE
String query = "SELECT * FROM usuarios WHERE email='" + email + "'";
// SEGURO
PreparedStatement ps = con.prepareStatement("SELECT * FROM usuarios WHERE email=?");
ps.setString(1, email);
CSRF (Cross-Site Request Forgery)
// Generar token CSRF al iniciar la sesión
String token = UUID.randomUUID().toString();
sesion.setAttribute("csrf_token", token);
// Incluirlo en el formulario como campo oculto
// <input type="hidden" name="csrf_token" value="${sessionScope.csrf_token}">
// Verificar en el Servlet que procesa el POST
String tokenEnviado = req.getParameter("csrf_token");
String tokenSesion = (String) sesion.getAttribute("csrf_token");
if (tokenSesion == null || !tokenSesion.equals(tokenEnviado)) {
resp.sendError(403, "Token CSRF inválido");
return;
}
Buenas prácticas generales
- Almacena contraseñas con bcrypt o Argon2 (nunca MD5 ni SHA-1). Usa la librería jBCrypt:
BCrypt.hashpw(password, BCrypt.gensalt(12)). - Usa HTTPS en producción. Configura un certificado TLS en Tomcat o delega a un proxy inverso (nginx, Apache).
- Configura cabeceras de seguridad HTTP (Content-Security-Policy, HSTS, X-Frame-Options) con un filtro.
- Valida y sanitiza todos los datos de entrada en el servidor, no solo en el cliente.
- Mantén Tomcat y las dependencias actualizados.
