web-dev-qa-db-fra.com

Symfony 4 - comment ajouter un jeton csrf sans créer de formulaire?

Je lis le tutoriel ici

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

comment ajouter un jeton csrf. Il dit d'utiliser

form_end()

dans le modèle. Mais cela ne fonctionne pas, donne une erreur:

Erreur de type: trop peu d'arguments pour fonctionner Symfony\Component\Form\FormRenderer :: renderBlock (), 0 transmis dans E:\projektai\php projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43dbf9907b6dbf896b7906 php sur la ligne 48 et au moins 2 attendus

Voici la réponse qui montre comment réparer mais ce n'est que lorsque vous avez construit un objet de formulaire:

Erreur de type Symfony: Trop peu d'arguments pour fonctionner FormRenderer :: renderBlock ()

Comment faire cela sans avoir d'objet de formulaire? Voici la connexion depuis la page de documentation de connexion:

{% 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

Vous pouvez utiliser l'aide twig function csrf_token comme décrit dans la doc ici , comme exemple:

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

Plus d'aide dans this réponse.

MISE À JOUR:

Autre stratégie: passer du contrôleur:

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

J'espère que cette aide

10
Matteo

Vous pouvez utiliser {{ form_row(form._token) }} pour générer le champ de jeton CSRF requis pour votre rendu de formulaire dans Symfony 3 (je suis actuellement en train d'utiliser cette méthode avec Symfony 3.4).

5
Sentence

{{form_end ()}} ne fonctionne que si vous avez quelque chose comme ça:

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

Vous pouvez créer un jeton personnalisé dans votre contrôleur, puis le transmettre à la vue comme ceci:

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

Et puis créez une entrée cachée dans votre twig with token:

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

Pour obtenir le bon csrf_token, Vous devez créer le FormView avec $form->createView(), puis utiliser le jeton à l'intérieur:

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

Toutes les autres solutions reposent sur la génération d'une chaîne statique qui ne change pas, ce qui viole l'objectif des jetons csrf.

0
Victor Timoftii