You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2023-10-30 10:39:35

djjeff80
Member
Registered: 2023-10-30
Posts: 3

Session lost on re-submitting

Hello,
seems to be a simple trick. Maybe by calling a specific function of the Session class. Unfortunately I can't find any hint in the plugin docs or in debugging other plugins/ pdf creation pages (e.g. Computer listing PDF export).

Question: How can I hold my session, even on reloading a page or re-submitting data for my PDF print?

What I'm trying:
- clicking on a tab on an inventory page, e.g. Computers
- tabs generating a form inside content area posting directly to a custom PHP site containing
  * itemType and itemId as hidden fields
  * submit button

What's happening:
- first submit, PDF file is generated successfully (for debugging purposes SESSION array print + die shows glpicsrftokens, glpicookietest, valid_id)
- second submit, fails into a "The action you have requested is not allowed." error message (for debugging purposes no SESSION array print + die are shown)
- access-errors.log is reporting "CSRF check failed for User ID: nnn at /plugins/xxx/front/pdfexport.php"
- using the "Return to previous page" link of the error message as well as clicking on another link in the GLPI gui after the first submit are working successfully

pdfexport.php:
* includes the inc/includes.php file
* called class extends CommonGLPI

Offline

#2 2023-10-30 14:12:06

cconard96
Moderator
Registered: 2018-07-31
Posts: 2,430
Website

Re: Session lost on re-submitting

Bonjour,

Les formulaires ne peuvent être soumis qu’une seule fois. Lorsqu'une page est demandée et que le formulaire est généré, un jeton CSRF est généré. Lorsqu'une requête POST (soumission de formulaire) est envoyée à GLPI, celui-ci vérifie le token CSRF du formulaire par rapport aux tokens de la session. Si l'un correspond, il est supprimé de la session pour empêcher sa réutilisation. Si aucun ne correspond, vous obtenez l’erreur CSRF. Tant que vous utilisez la méthode "Html::closeForm" pour ajouter la balise de fin "</form>", cela ajoutera également une entrée masquée contenant le jeton.

Ce n'est généralement pas un problème car la soumission d'un formulaire rechargera la page et générera donc un nouveau jeton. Vous ne pouvez pas soumettre à nouveau les données car elles contiendraient le jeton expiré.


GLPI Collaborator and Plugin Developer.
My non-English comments are automated translations. Sorry for any confusion that causes.
Mes commentaires non anglais sont des traductions automatiques. Désolé pour toute confusion qui cause.
Mis comentarios que no están en inglés son traducciones automáticas. Perdón por cualquier confusión que cause.

Offline

#3 2023-10-30 16:36:11

djjeff80
Member
Registered: 2023-10-30
Posts: 3

Re: Session lost on re-submitting

cconard96 wrote:

Bonjour,

Les formulaires ne peuvent être soumis qu’une seule fois. Lorsqu'une page est demandée et que le formulaire est généré, un jeton CSRF est généré. Lorsqu'une requête POST (soumission de formulaire) est envoyée à GLPI, celui-ci vérifie le token CSRF du formulaire par rapport aux tokens de la session. Si l'un correspond, il est supprimé de la session pour empêcher sa réutilisation. Si aucun ne correspond, vous obtenez l’erreur CSRF. Tant que vous utilisez la méthode "Html::closeForm" pour ajouter la balise de fin "</form>", cela ajoutera également une entrée masquée contenant le jeton.

Ce n'est généralement pas un problème car la soumission d'un formulaire rechargera la page et générera donc un nouveau jeton. Vous ne pouvez pas soumettre à nouveau les données car elles contiendraient le jeton expiré.

I've finished the generation of the form with the "Html::closeForm" call.
So there ain't any possibility to set a new csrf after clicking the submit button?

Offline

#4 2023-11-02 08:03:59

djjeff80
Member
Registered: 2023-10-30
Posts: 3

Re: Session lost on re-submitting

Got it. For all the people running into the same problem, you can add the following lines to the post addressed PHP file before the first call of a class using the GLPI classes. Big thanks to Remi Collet and Nelly Mahu-Lasson created the PDF plugin using this hack in their code:

define('GLPI_KEEP_CSRF_TOKEN', true); // 0.90
$token = (isset($_POST['_glpi_csrf_token']) ? $_POST['_glpi_csrf_token'] : false);

if (!isset($_SESSION['glpicsrftokens'][$token])) {
    $_SESSION['glpicsrftokens'][$token] = time() + GLPI_CSRF_EXPIRES;
}

Offline

Board footer

Powered by FluxBB