web-dev-qa-db-fra.com

La vérification des jetons ne fonctionne pas dans l'admin du composant personnalisé

J'ai construit un composant personnalisé et trois formulaires exécutent différentes tâches dans la vue default.php sur les sous-contrôleurs de l'administrateur. Dans ma vue tmpl default.php, Chaque formulaire a un <?php echo JHtml::_('form.token'); ?> qui restitue un champ masqué avec un jeton comme nom avec une valeur de 1. J'ai une vérification dans mon sous-contrôleur, JSession::checkToken() or die pour déterminer si le jeton est valide.

Le problème est que lors de la soumission d'un formulaire via POST, les données POST avec le jeton et la fonction JSession::checkToken()] vérifiant que le jeton ne correspondent pas) donnent donc FALSE. Après avoir débogué la classe JSession, j’ai constaté que lorsqu’il reçoit un jeton, ce n’est PAS le même que le jeton en cours de publication. J'ai effectué une recherche sur Google, mais je pouvais trouver une solution satisfaisante.

Selon la documentation de Joomla sur CSRF , il est supposé être aussi simple que d'ajouter <?php echo JHtml::_('form.token'); ?> et d'ajouter le contrôle dans le contrôleur JSession::checkToken() or die.

Comment les deux jetons peuvent-ils différer de la forme POST et de la classe JSession? Y a-t-il autre chose qui me manque ou n'a pas été ajouté qui ne figure pas dans la documentation Joomla?

2
RNickMcCandless

Quelques choses me viennent à l'esprit:

Êtes-vous sûr de vous soumettre à un contrôleur "de site", et non à un contrôleur "d'admin"? Le jeton pour un site contre un formulaire d'administrateur sera différent, car la session est différente.

Êtes-vous sûr de soumettre via POST? Si vous soumettez via GET, vous devez vérifier le jeton à l'aide de JSession::checkToken('get')

Êtes-vous sûr d'avoir placé le champ de jeton dans les balises de formulaire? Vous pouvez voir la source pour vérifier que tout cela semble correct.

3
user101289