Un bug intermittent est le plus difficile à diagnostiquer, car il échoue à l’étape la plus élémentaire du débogage : le reproduire à volonté. Un bouton « supprimer l’article » du panier latéral d’une boutique échouait avec une erreur 403 Forbidden pour certains visiteurs, de temps en temps, sans rien d’utile dans le journal d’erreurs PHP pour en indiquer la cause.
Lire la signature de l’échec
Le corps de la réponse de la requête AJAX était un simple -1, accompagné d’un statut HTTP 403. Cette combinaison précise est la signature de WordPress pour un échec de check_ajax_referer(), la vérification du nonce de sécurité que tout gestionnaire AJAX bien conçu effectue avant toute autre chose. Le nonce envoyé par la page ne correspondait tout simplement pas à ce qu’attendait le serveur.
Pourquoi un nonce pourtant valide pouvait échouer
Les nonces WordPress ne sont pas permanents : ils sont générés à chaque chargement de page et expirent après environ 24 à 48 heures, liés à une fenêtre de temps glissante plutôt qu’à une valeur fixe. Or le cache de page complet LiteSpeed du site était configuré avec une durée de 7 jours : une page en cache pouvait donc être servie telle quelle à tous les visiteurs jusqu’à une semaine après sa création.
Toute page encore servie depuis le cache plus de deux jours environ après sa mise en cache distribuait un nonce déjà expiré au moment où un vrai visiteur tentait de l’utiliser, non pas à cause d’un problème dans la session de ce visiteur, mais parce que le HTML lui-même était périmé par rapport à l’horloge de sécurité de WordPress.
La correction, et pourquoi c’en est une vraie et non un contournement
Réduire la durée du cache de page à 6 heures, bien en dessous de la durée de vie minimale d’un nonce WordPress, a résolu le problème immédiatement et complètement, car cela traite le décalage réel au lieu de masquer un symptôme. Pendant l’enquête, nous avons aussi supprimé de la page de paiement une interface de panier en double, sans rapport avec le bug, puisque le récapitulatif de commande du paiement affichait déjà les mêmes informations.
Points clés
- Un corps de réponse
-1avec un HTTP 403 est quasiment l’empreinte d’un échec de vérification de nonce WordPress : cela vaut la peine de le reconnaître au premier coup d’œil. - La durée du cache de page complet et la durée de vie des jetons de sécurité de WordPress sont deux réglages qui doivent être cohérents entre eux, et rien ne l’impose par défaut.
- Un bug intermittent et apparemment aléatoire est souvent un décalage temporel entre deux systèmes qui fonctionnent chacun correctement de leur côté.
À lire aussi : un décalage horaire de six heures, ce que couvre vraiment la maintenance de site web.
Vous rencontrez une limite similaire dans votre administration WooCommerce ou WordPress ? Parlons-en : ArtinTech Solution conçoit exactement ce type d’outils sur mesure pour les boutiques.