J'ai déjà utilisé les méthodes décrites sur cette page dans Joomla plusieurs fois:
http://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms
Maintenant, je veux mettre en œuvre le même mécanisme en utilisant le Joomla Framework et le Framework App . J'ai donc essayé ceci:
$token = $this->app->getFormToken();
Mais cela provoque la fermeture de l'application. J'ai parcouru le code et le problème commence dans la fonction getFormToken ici:
return md5($this->get('secret') . $userId . $this->session->getToken($forceNew));
$ this-> get ('secret') retourne ici car il n'y a pas de point dans 'secret':
if (!strpos($path, '.'))
{
return (isset($this->data->$path) && $this->data->$path !== null && $this->data->$path !== '') ? $this->data->$path : $default;
}
Ensuite, cette fonction est exécutée depuis Symfony:
public function write($sessionId, $data)
{
return (bool) $this->handler->write($sessionId, $data);
}
Et enfin cette fonction s'exécute:
public function close()
{
$this->active = false;
return (bool) $this->handler->close();
}
Ce qui quitte l'application.
Qu'est-ce que je fais mal? Dois-je ajouter un "secret" quelque part? Comment dois-je générer un jeton de formulaire que je vérifie ensuite lors de l'envoi du formulaire?
J'ai finalement réussi. J'avais besoin de créer une session et de l'attribuer à l'application avant que getFormToken ne fonctionne. J'utilise donc d'abord la session Joomla:
use Joomla\Session\Session;
Puis créez la session, configurez-la et récupérez le jeton de formulaire:
$session = Session::getInstance('none');
$this->app->setSession($session);
$token = $this->app->getFormToken();
Facile quand vous savez comment! J'espère que ça aidera quelqu'un d'autre.