seenthis / seenthis_squelettes

plugin "squelettes" de seenthis
11 stars 6 forks source link

Problème avec les jetons de formulaires de SPIP 3.2.12 #275

Closed brunob closed 2 years ago

brunob commented 2 years ago

Signalé ici https://seenthis.net/messages/941656#message941753

Suite au passage en 3.2.12 le formulaire poster_message génère une erreur, le plus souvent lors d'un post de commentaire, cf les logs :

Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire non signe mais on a une session)
Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire signe mais ne correspond pas a la session)

Cela semble aussi impacter le formulaire de login, qu'on surcharge ici https://github.com/seenthis/seenthis_squelettes/tree/master/formulaires cf le log :

Pub:ERREUR: signature ajax form incorrecte : login (formulaire non signe mais on a une session)

En attendant, pour permettre aux gens d'utiliser le site je suis revenu avant le commit https://git.spip.net/spip/spip/commit/fea5b5b4507cc9c0b9e91bbfbf34fe40b0bea805 sur SPIP et ça règle le bug.

J'ai testé en local et je reproduis le bug, si j'ajoute un #CACHE{0} au formulaire poster_message, je peux poster des commentaires sans problèmes avec deux comptes différents sur la même page.

Concernant le formulaire de login, je ne reproduis pas en local.

brunob commented 2 years ago

Après quelques tests, je vois que le formulaire poster_message comporte la même valeur pour le champ hidden formulaire_action_sign dans pour le même post affiché dans deux fenêtres utilisant un compte différent, ce qui génère le logo suivant Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire signe mais ne correspond pas a la session) qui semble bien justifié.

Il semble donc y avoir un problème de cache avec ce formulaire, ce qui entre en conflit avec le nouveau système de jeton de formulaire introduit par SPIP 3.2.12 et qui expliquerait que l'ajout d'un #CACHE{0} dans le squelette du formulaire fixe le bug. Avant d'appliquer ce patch tout bête, j'aimerais mieux comprendre le bug, à suivre...

PS : les squelettes qui affichent ce formulaire passent par la fonction microcache, c'est une piste à suivre.

brunob commented 2 years ago

En regardant en détail ce qui se passe dans le cache, depuis la page d'un message dans le même cas de figure que cité plus haut (page affichée par deux comptes différents dans deux fenêtre distinctes) :

  1. affichage de la page par l'auteur A
  2. recherche de formulaire_action_sign dans tmp/cache
  3. affichage de la page par l'auteur B
  4. on a le même nombre de fichier de cache qui contiennent formulaire_action_sign

Donc, une noisette contenant le formulaire et mise en cache par microcache fait que le formulaire en question comporte la même valeur de jeton dans le hidden formulaire_action_sign, ce qui génère l'erreur quand on tente de poster le formulaire (sauf pour l'auteur qui a généré la mise en cache). Ça explique pourquoi ça fonctionne bien quand on relcalcule la page...

Et pour confirmer que ça vient bien de microcache, si dans https://github.com/seenthis/seenthis_squelettes/blob/master/message.html#L22 je remplace [(#ID_ME|microcache{noisettes/message/afficher_message})] par <INCLURE{fond=noisettes/message/afficher_message,id=#ID_ME}> alors on a bien un jeton différent pour chaque fichier de cache du formulaire.

brunob commented 2 years ago

Pour palier à ce cas de figure, il faudrait que https://git.spip.net/spip/spip/commit/fea5b5b4507cc9c0b9e91bbfbf34fe40b0bea805 utilise l'argument $att de securiser_action() ? => nope, pas mieux

rastapopougros commented 2 years ago

c'est surtout qu'un formulaire doit toujours être dynamique et jamais jamais mis en cache en commun, et donc c'est un problème du squelette appelant (ou de l'un de ses parents) ou du système de cache propre à ST, de garder ça "statiquement" non ? C'est comme avoir un form dans un squelette inclus par #INCLURE statique, ça doit être interdit normalement…

brunob commented 2 years ago

Patch de base proposé, comme je le disais sur IRC :

ça ne me choque pas des masses d'ajouter un cache à 0 dans le form, il contient déjà :

HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}

HTTP_HEADER{"Pragma: no-cache"}

brunob commented 2 years ago

Grml, il semble que ça ne règle pas le bug, après plusieurs vidanges de cache, les gens remonte encore l'erreur, et cette fois je vois plein de Pub:ERREUR: signature ajax form incorrecte : poster_message (formulaire non signe mais on a une session) dans formulaires.log :(

brunob commented 2 years ago

Ha ben wala... @Fil disait il y a 9 ans :

cela dit, pourquoi un formulaire se trouve-t-il en microcache... https://git.spip.net/spip-contrib-extensions/seenthis_microcache/commit/f3c3949b23f56cc7334ddd599e68985335616063

Il est bien là le bug !

Et ici aussi il est mention de problème avec microcache et les formulaires https://github.com/seenthis/seenthis_squelettes/commit/6ee1f7f7453384bcf716f76e124b2af876a7968d#diff-be92c1d33270d515e882f1234bba9136d4040b0756ce8c16613acb01ec9c8370

Bref, on n'a pas sorti le cul des ronces...

brunob commented 2 years ago

Après avoir retourné le problème dans tous les sens, je ne vois qu'une solution, charger le formulaire en ajax comme on le fait déjà pour le formulaire modifier_me cf https://github.com/seenthis/seenthis_squelettes/blob/master/noisettes/message/afficher_un_message.html#L41