如何在Twig中渲染CSRF输入?

46
我知道通常使用form_rest来渲染CSRF令牌的隐藏输入,但是否有一种方法只渲染 CSRF 输入本身 ?我在主题中重写了{% block field_widget %}以呈现额外文本的一部分。但是由于CSRF令牌也呈现在输入字段中,我得到了一个我不需要的文本片段旁边的隐藏字段。因此,我想用一个参数将它单独渲染出来,并告诉它不要呈现这个文本。
5个回答

101

您可以通过使用{{ form_widget(formView._token) }}来完成


55
如果你有formView对象,你可以使用Twig函数进行渲染:
{{ form_widget(formView._token) }} 

如果您还没有这样做 - 您可以直接渲染令牌而不使用表单对象:

<input type="hidden" name="token" value="{{ csrf_token('some-name') }}">

适用于Symfony 2.x和3.x

要验证令牌,您可以在控制器中使用以下代码(Symfony 3.x):

$submittedToken = $request->request->get('token');

if ($this->isCsrfTokenValid('some-name', $submittedToken)) {
    // ... do something,
}

1
很好知道,有时这是非常有用的功能。 - Luciano Mammino
2
抱歉,对我没用 :( 我在Symfony 3.1中得到了“仅当在FormRenderer :: __ construct()中注入CsrfTokenManagerInterface时才能生成CSRF令牌。”但是哪个FormRenderer?我不想使用任何表单。 - Xover
这在Symfony 3.2中对我有效。尽管您说“authenticate”应该是表单名称,但我不认为这是正确的。如果您要用它进行登录,它应该始终是“authenticate”。请参阅官方文档了解更多信息。 - Niket Pathak
1
@NiketPathak 谢谢,已更新答案并添加了新信息。 - pliashkou

21

或者你可以简单地使用这个:

{{ form_row(form._token) }}

这将根据您使用的表单类型自动生成正确的隐藏HTML元素,即正确的HTML结构和字段名称。


4

我需要在Twig中呈现csrf输入,以便我可以将其用于删除操作。根据@YuryPliashkou的回答使用{{ csrf_token('authenticate') }}会给我一个不正确的令牌(仅适用于登录!)

对我有用的是这个{{ csrf_token('form') }},它给了我正确的csrf令牌,我会通过ajax将其传递给我的控制器。

<span id="csrf_token" data-token="{{ csrf_token('form') }}"></span> 
// my ajax call
$.ajax({
    url: localhost/admin/product/4545,   // 4545->id of the item to be deleted
    type: 'POST',
    data: {
        "_method": "DELETE",
        "form[_token]": $("#csrf_token").data("token")   // passed csrf token here
    },
    success: function(result) {
        // Do something 
   }
});

已验证其在Symfony 3.x上工作。

参考文献


1

我没有找到适合我的解决方案,但我发现并测试了一个对于我的Symfony3有用的示例,其中包含了"value="{{ _token }}"。

     <form name="form" method="post" action="{{ path('blog_show', { 'id': blog.id }) }}">
       <input name="_method" value="DELETE" type="hidden">
       <input class="btn btn-danger" value="Delete" type="submit">
       <input id="form__token" name="form[_token]" value="{{ _token }}" type="hidden">
    </form>

关于scrf的更多信息可以在这里查看:手动创建Symfony2表单,但仍使用其CSRF和isValid()功能


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接