Symfony 4 - 如何在没有构建表单的情况下添加 csrf 令牌?
Symfony 4 - how to add csrf token without building form?
我正在阅读这里的教程
https://symfony.com/doc/current/form/csrf_protection.html
如何添加 csrf 令牌。它说使用
form_end()
在模板中。但这不起作用,给出错误:
Type error: Too few arguments to function
Symfony\Component\Form\FormRenderer::renderBlock(), 0 passed in
E:\projektai\php
projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43dabf593090ebc4c897ce72b1a979082d62914b47.php
on line 48 and at least 2 expected
这是显示如何修复的答案,但只有当您构建了表单对象时才会出现:
没有表单对象怎么办?这是从登录文档页面登录:
{% 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() }}
{{ 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 }}">
您可以按照文档 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();
希望对您有所帮助
您可以使用 {{ form_row(form._token) }}
为您在 Symfony 3 中呈现的表单生成所需的 CSRF 令牌字段(我目前在 Symfony 3.4 中使用此方法)。
要获得正确的 csrf_token
,您应该使用 $form->createView()
创建 FormView
,然后使用其中的令牌:
<input type="hidden" name="_token" value="{{ form._token.vars.value }}">
所有其他解决方案都依赖于生成不会更改的静态字符串,这违反了 csrf 令牌的目的。
我正在阅读这里的教程
https://symfony.com/doc/current/form/csrf_protection.html
如何添加 csrf 令牌。它说使用
form_end()
在模板中。但这不起作用,给出错误:
Type error: Too few arguments to function Symfony\Component\Form\FormRenderer::renderBlock(), 0 passed in E:\projektai\php projektai\htdocs\mokomieji\symfony_4_demo\var\cache\dev\twig\bb\bb2248f7be504240fcc2ab43dabf593090ebc4c897ce72b1a979082d62914b47.php on line 48 and at least 2 expected
这是显示如何修复的答案,但只有当您构建了表单对象时才会出现:
没有表单对象怎么办?这是从登录文档页面登录:
{% 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() }}
{{ 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 }}">
您可以按照文档 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();
希望对您有所帮助
您可以使用 {{ form_row(form._token) }}
为您在 Symfony 3 中呈现的表单生成所需的 CSRF 令牌字段(我目前在 Symfony 3.4 中使用此方法)。
要获得正确的 csrf_token
,您应该使用 $form->createView()
创建 FormView
,然后使用其中的令牌:
<input type="hidden" name="_token" value="{{ form._token.vars.value }}">
所有其他解决方案都依赖于生成不会更改的静态字符串,这违反了 csrf 令牌的目的。