Saltar al contenido principal

ArtinTech Solution

Fixing an Intermittent 403 Error Caused by Cache TTL

Un error intermitente es el peor de diagnosticar, porque falla en el paso más básico de la depuración: reproducirlo a voluntad. Un botón «eliminar artículo» del carrito lateral de una tienda fallaba con un error 403 Forbidden para algunos visitantes, algunas veces, sin nada útil en el registro de errores de PHP que apuntara a una causa.

Leer la firma del fallo

El cuerpo de la respuesta de la petición AJAX era un simple -1 junto a un estado HTTP 403. Esa combinación concreta es la firma de WordPress para una llamada fallida a check_ajax_referer(), la verificación del nonce de seguridad que todo controlador AJAX bien hecho realiza antes de hacer nada más. El nonce que enviaba la página simplemente no coincidía con lo que esperaba el servidor.

Por qué un nonce válido podía fallar

Los nonces de WordPress no son permanentes: se generan en cada carga de página y caducan tras unas 24 a 48 horas, ligados a una ventana de tiempo móvil y no a un valor fijo. Sin embargo, la caché de página completa LiteSpeed del sitio estaba configurada con un TTL de 7 días, lo que significaba que una página en caché podía servirse sin cambios a todos los visitantes durante hasta una semana después de generarse.

Toda página servida desde la caché más de unos dos días después de guardarse entregaba un nonce que ya había caducado cuando un visitante real intentaba usarlo; no por un problema en la sesión de ese visitante, sino porque el propio HTML estaba desfasado respecto al reloj de seguridad de WordPress.

La solución, y por qué es una solución real y no un parche

Reducir el TTL de la caché de página a 6 horas, holgadamente por debajo de la vida mínima de un nonce de WordPress, lo resolvió de inmediato y por completo, porque ataca el desajuste real en lugar de tapar un síntoma. Durante la investigación también eliminamos de la página de checkout una interfaz de carrito duplicada que no tenía relación con el fallo, ya que el resumen del pedido del checkout ya mostraba la misma información.

Conclusiones clave

  • Un cuerpo de respuesta -1 con HTTP 403 es casi una huella dactilar de una comprobación de nonce de WordPress fallida: vale la pena reconocerlo a simple vista.
  • El TTL de la caché de página completa y la vida útil de los tokens de seguridad de WordPress son dos ajustes que deben ser coherentes entre sí, y nada lo garantiza por defecto.
  • Un error intermitente y aparentemente aleatorio suele ser un desajuste de tiempos entre dos sistemas que funcionan bien por separado.

Lecturas relacionadas: un desfase de seis horas en las marcas de tiempo, qué incluye realmente el mantenimiento web.

¿Se encuentra con una limitación parecida en su panel de WooCommerce o WordPress? Hablemos: en ArtinTech Solution creamos exactamente este tipo de herramientas a medida para tiendas.

Share this article

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *