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() }}
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
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).
{{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 }}">
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.