【发布时间】:2018-08-14 16:33:45
【问题描述】:
我知道使用form_rest 呈现 CSRF 令牌隐藏输入的常用方法,但有没有办法呈现 仅 CSRF 输入本身?我在主题中覆盖了{% block field_widget %} 以呈现一段额外的文本。但是由于 CSRF 令牌也在输入字段中呈现,并且我在隐藏字段旁边得到了一段我不需要的文本。所以我想用一个参数单独渲染它,告诉它不要渲染这个文本。
【问题讨论】:
我知道使用form_rest 呈现 CSRF 令牌隐藏输入的常用方法,但有没有办法呈现 仅 CSRF 输入本身?我在主题中覆盖了{% block field_widget %} 以呈现一段额外的文本。但是由于 CSRF 令牌也在输入字段中呈现,并且我在隐藏字段旁边得到了一段我不需要的文本。所以我想用一个参数单独渲染它,告诉它不要渲染这个文本。
【问题讨论】:
你可以用{{ form_widget(formView._token) }}做到这一点
【讨论】:
如果你有 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,
}
【讨论】:
或者你可以简单地使用这个:
{{ form_row(form._token) }}
这将根据您使用的表单类型自动生成正确的隐藏 HTML 元素,即正确的 HTML 结构和字段名称。
【讨论】:
我需要在 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 上的工作。
【讨论】:
没有找到适合我的解决方案,在示例中找到并测试并为我的 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 的信息可以在这里查看:Creating forms manually in Symfony2, but still use its CSRF and isValid() functionalily
【讨论】: