Servlets y JSP: tutorial Jakarta EE 10 y Java 21

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR