web-dev-qa-db-ja.com

symfony 4-フォームを構築せずにcsrfトークンを追加する方法?

ここでチュートリアルを読んでいます

https://symfony.com/doc/current/form/csrf_protection.html

csrfトークンを追加する方法。使うように言う

form_end()

テンプレート内。しかし、これは機能していません、エラーが発生します:

タイプエラー:関数の引数が少なすぎますSymfony\Component\Form\FormRenderer :: renderBlock()、0がE:\ projektai\php projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43d4c97ab14dbcc897c229b1cb4cb4cd4cd4cbdbcd4cbdb2c3d4c3c4c4c9ab4d3c0c0c0c0b4b0e0e0e0e0c0d0b0e0b0e0a0f0a0e0e0dに渡されました48行目のphpと少なくとも2つが期待されています

修正方法を示す回答がありますが、フォームオブジェクトを作成した場合のみです。

symfony Type error:関数の引数が少なすぎるためFormRenderer :: renderBlock()

フォームオブジェクトなしでこれを行うにはどうすればよいですか?ログインドキュメントページからのログインは次のとおりです。

{% if error %}
    <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}

<form action="{{ path('login') }}" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="_username" value="{{ last_username }}" />

    <label for="password">Password:</label>
    <input type="password" id="password" name="_password" />

    <button type="submit">Login</button>

{{  form_end() }}
6
Darius.V

ヘルパーを使用できますtwig function csrf_tokenドキュメントに記載されているように here 、例:

 <input type="hidden" name="_csrf_token"
        value="{{ csrf_token('authenticate') }}"
    >

this 回答でさらにヘルプ。

UPDATE:

その他の戦略:コントローラから渡す:

    $tokenProvider = $this->container->get('security.csrf.token_manager');
    $token = $tokenProvider->getToken('example')->getValue();

この助けを願っています

10
Matteo

{{ form_row(form._token) }}を使用して、Symfony 3でレンダリングするフォームに必要なCSRFトークンフィールドを生成できます(私は現在、このメソッドをSymfony 3.4で使用しています)。

5
Sentence

{{form_end()}}は、次のような場合にのみ機能します。

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

コントローラでカスタムトークンを作成し、次のようにビューに渡すことができます。

    $csrf = $this->container->get('security.csrf.token_manager');
    $token = $csrf->refreshToken('yourkey');

そして、twigトークンに隠し入力を作成します:

<input type="hidden" name="_token" value="{{ token }}">
3
Generwp

正しい_csrf_token_を取得するには、FormView$form->createView()で作成し、その内部のトークンを使用する必要があります。

_<input type="hidden" name="_token" value="{{ form._token.vars.value }}">
_

他のすべてのソリューションは、変更されない静的文字列の生成に依存しており、csrfトークンの目的に違反しています。

0
Victor Timoftii