45

我知道有通常的方法来呈现 CSRF 令牌隐藏输入form_rest,但是有没有办法只呈现CSRF输入本身?我已经覆盖{% block field_widget %}了主题以呈现一段额外的文本。但是由于 CSRF 令牌也在输入字段中呈现,并且我在隐藏字段旁边得到了一段我不需要的文本。所以我想用一个参数单独渲染它,告诉它不要渲染这个文本。

4

5 回答 5

101

你可以用{{ form_widget(formView._token) }}

于 2011-09-20T18:16:32.160 回答
54

如果你有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,
}
于 2014-01-26T16:28:57.027 回答
20

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

{{ form_row(form._token) }}

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

于 2014-11-26T15:51:24.950 回答
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上的工作。

参考

于 2017-03-25T02:24:41.480 回答
1

没有找到适合我的解决方案,在示例中找到并测试并为我的 Simfony3 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()

于 2016-09-30T04:38:14.233 回答