it-swarm-es.tech

Implemente CSRF anti-spoofing usando el Marco Joomla

He usado los métodos descritos en esta página en Joomla muchas veces antes:

http://docs.joomla.org/How_to_add_CSRF_anti-spoofing_to_forms

Ahora quiero implementar el mismo mecanismo usando Marco de Joomla y Aplicación de Marco . Entonces he intentado esto:

$token = $this->app->getFormToken();

Pero esto hace que la aplicación salga. He recorrido el código y el problema comienza en la función getFormToken aquí:

return md5($this->get('secret') . $userId . $this->session->getToken($forceNew));

$ this-> get ('secret') regresa aquí porque no hay punto en 'secret':

if (!strpos($path, '.'))
{
    return (isset($this->data->$path) && $this->data->$path !== null && $this->data->$path !== '') ? $this->data->$path : $default;
}

Entonces esta función se ejecuta desde Symfony:

public function write($sessionId, $data)
{
    return (bool) $this->handler->write($sessionId, $data);
}

Y finalmente esta función se ejecuta:

public function close()
{
    $this->active = false;

    return (bool) $this->handler->close();
}

Que sale de la aplicación.

¿Qué estoy haciendo mal? ¿Necesito agregar un 'secreto' en alguna parte? ¿Cómo debo generar un token de formulario que luego verifico cuando se envía el formulario?

6
Joe P

Finalmente lo resolví. Necesitaba crear una sesión y asignarla a la aplicación antes de que getFormToken funcionara. Así que primero uso la sesión de Joomla:

use Joomla\Session\Session;

Luego cree la sesión, configúrela y obtenga el token de formulario:

$session = Session::getInstance('none');
$this->app->setSession($session);
$token = $this->app->getFormToken();

¡Fácil cuando sabes cómo! Espero que esto ayude a alguien más.

4
Joe P