web-dev-qa-db-ja.com

Joomlaフレームワークを使用してCSRFなりすましを実装する

私は以前にJoomlaでこのページで説明されている方法を何度も使用しました:

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

Joomla FrameworkFramework App を使用して同じメカニズムを実装したいと思います。だから私はこれを試しました:

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

しかし、これによりアプリケーションが終了します。コードをステップ実行しましたが、問題はここのgetFormToken関数で始まります。

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

$ this-> get( 'secret')は、 'secret'にドットがないため、ここに戻ります。

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

次に、この関数はSymfonyから実行されます:

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

そして最後にこの関数が実行されます:

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

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

アプリケーションを終了します。

何が悪いのですか?どこかに「秘密」を追加する必要がありますか?フォームが送信されたときに確認するフォームトークンをどのように生成しますか?

6
Joe P

ようやく解決しました。 getFormTokenが機能する前に、セッションを作成してアプリに割り当てる必要がありました。したがって、最初にJoomlaセッションを使用します。

use Joomla\Session\Session;

次に、セッションを作成して設定し、フォームトークンを取得します。

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

方法がわかれば簡単!これが他の誰かの役に立つことを願っています。

4
Joe P