web-dev-qa-db-fra.com

Implémentez l'anti-usurpation CSRF à l'aide du framework Joomla

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?

6
Joe P

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.

4
Joe P