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->createView()
创建FormView
,然后使用其中的令牌:
<input type="hidden" name="_token" value=" form._token.vars.value ">
所有其他解决方案都依赖于生成不变的静态字符串,这违反了 csrf 令牌的目的。
【讨论】:
以上是关于Symfony 4 - 如何在不构建表单的情况下添加 csrf 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 JQuery 的情况下使用 fetch API 以 JSON 格式发布表单数据?
在 Rails 4 中,如何在不刷新的情况下在页面上提交表单和更新元素
Angular 4:如何在不丢失响应式设计元标记的情况下构建生产。