我在这里阅读教程
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() }}
答案 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令牌的目的。