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

Posted

技术标签:

【中文标题】Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?【英文标题】:Symfony 4 - how to add csrf token without building form? 【发布时间】:2018-06-01 00:08:30 【问题描述】:

我在这里看教程

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\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() 

【问题讨论】:

【参考方案1】:

您可以使用文档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();

希望有帮助

【讨论】:

这确实给出了错误:在渲染模板期间抛出了异常(“只有在 FormRenderer::__construct() 中注入 CsrfTokenManagerInterface 时才能生成 CSRF 令牌。”)。跨度> gettoken 中的“example”代表什么?【参考方案2】:

您可以使用 form_row(form._token) 为您在 Symfony 3 中的表单渲染生成所需的 CSRF 令牌字段(我目前在 Symfony 3.4 中使用此方法)。

【讨论】:

【参考方案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 ">

【讨论】:

【参考方案4】:

要获得正确的csrf_token,您应该使用$form-&gt;createView() 创建FormView,然后使用其中的令牌:

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

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

【讨论】:

以上是关于Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 JQuery 的情况下使用 fetch API 以 JSON 格式发布表单数据?

在 Rails 4 中,如何在不刷新的情况下在页面上提交表单和更新元素

如何使用 symfony 4 创建登录验证表单

Angular 4:如何在不丢失响应式设计元标记的情况下构建生产。

在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段

如何在 symfony2 中提交表单 ajax?