Symfony 4 - 如何在不构建表单的情况下添加csrf令牌?

时间:2017-12-18 15:56:59

标签: forms symfony symfony-forms csrf-protection

我在这里阅读教程

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 \缓存\ dev的\树枝\ BB \ bb2248f7be504240fcc2ab43dabf593090ebc4c897ce72b1a979082d62914b47.php   在48行和至少2预期

以下是显示如何修复的答案,但只有在构建了表单对象时才会出现:

Symfony Type error: Too few arguments to function 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() }}

4 个答案:

答案 0 :(得分:6)

您可以使用文档here中所述的辅助树枝函数csrf_token,例如:

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

this回答更多帮助。

<强>更新

其他策略:从控制器传递:

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

希望这个帮助

答案 1 :(得分:3)

{{form_end()}} 仅在您有类似内容时才有效:

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

您可以在控制器中创建自定义令牌,然后将其传递给视图,如下所示:

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

然后使用令牌在您的树枝中创建隐藏输入:

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

答案 2 :(得分:1)

您可以使用Tools->Android->SDK Manager Click on SDK Tools Check the Show Package Details Box in the Lower Right Unselect Android SDK Build Tools 26 or higher Select Android SDK Build Tools 25.0.3 为Symfony 3中的表单呈现生成所需的CSRF令牌字段(我现在使用Symfony 3.4的方法)。

答案 3 :(得分:0)

要获得正确的Hash[Person.all.collect { |user| [user.email, user.attributes.except(:email, :created_at, :updated_at).values] }] ,应使用csrf_token创建FormView,然后使用其中的令牌:

$form->createView()

所有其他解决方案都依赖于生成不会更改的静态字符串,这违反了csrf令牌的目的。