ti-enxame.com

Implementar anti-spoofing de CSRF usando o Joomla Framework

Eu usei os métodos descritos nesta página no Joomla muitas vezes antes:

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

Agora eu quero implementar o mesmo mecanismo usando o Joomla Framework e o Framework App . Então, eu tentei isso:

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

Mas isso faz com que o aplicativo saia. Eu segui o código e o problema começa na função getFormToken aqui:

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

$ this-> get ('secret') retorna aqui porque não há ponto em 'secret':

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

Então esta função é executada no Symfony:

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

E finalmente esta função é executada:

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

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

Que sai do aplicativo.

O que estou fazendo errado? Preciso adicionar um 'segredo' em algum lugar? Como devo gerar um token de formulário e depois verificar quando o formulário é enviado?

6
Joe P

Eu finalmente resolvi. Eu precisava criar uma sessão e atribuí-la ao aplicativo antes que o getFormToken funcionasse. Então, primeiro eu uso a sessão do Joomla:

use Joomla\Session\Session;

Em seguida, crie a sessão, defina-a e obtenha o token do formulário:

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

Fácil quando você sabe como! Espero que isto ajude alguém.

4
Joe P