Php CSRF令牌无效。请尝试重新提交表单
每次尝试提交表单时,我都会收到以下错误消息: CSRF令牌无效。请尝试重新提交表单 我的表格代码如下:Php CSRF令牌无效。请尝试重新提交表单,php,symfony,twig,Php,Symfony,Twig,每次尝试提交表单时,我都会收到以下错误消息: CSRF令牌无效。请尝试重新提交表单 我的表格代码如下: <form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal"> <div class="form-group"> {{ form_label(form.email
<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
<div class="form-group">
{{ form_label(form.email, 'Email', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
{{ form_widget(form.email, {'attr': {'class': 'col-md-2'}}) }}
{{ form_errors(form.email) }}
</div>
<div class="form-group">
{{ form_label(form.nickname, 'Nickname', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
{{ form_widget(form.nickname, {'attr':{'class': 'col-md-2'}}) }}
{{ form_errors(form.nickname, {'attr': {'class': 'col-md-3'}}) }}
</div>
<div class="form-group">
{{ form_label(form.password, 'password', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
{{ form_widget(form.password, {'attr': {'class': 'col-md-2'}}) }}
{{ form_errors(form.password, {'attr': {'class': 'col-md-3'}}) }}
</div>
<div class="form-group">
{{ form_label(form.password_repeat, 'Repeat password', {'label_attr': {'class': 'col-md-1 control-label'}}) }}
{{ form_widget(form.password_repeat, {'attr':{'class': 'col-md-2'}}) }}
{{ form_errors(form.password_repeat, {'attr': {'class': 'col-md-3'}}) }}
</div>
<div class="form-group">
<div class="col-md-1 control-label">
<input type="submit" value="submit">
</div>
</div>
</form>
{{form_label(form.email,'email',{'label_attr':{'class':'col-md-1 control label'}}}}}
{{form_小部件(form.email,{'attr':{'class':'col-md-2'}}}}}
{{form_errors(form.email)}
{{form_label(form.昵称,'昵称',{'label_attr':{'class':'col-md-1控件标签'}}}}}
{{form_小部件(form.昵称,{'attr':{'class':'col-md-2'}}}}}
{{form_errors(form.昵称,{'attr':{'class':'col-md-3'}}}}}
{{form_label(form.password,'password',{'label_attr':{'class':'col-md-1 control label'}}}}}
{{form_小部件(form.password,{'attr':{'class':'col-md-2'}}}}}
{{form_错误(form.password,{'attr':{'class':'col-md-3'}}}}}
{form_label(form.password_repeat,'repeat password',{'label_attr':{'class':'col-md-1 control label'}}}}
{{form_小部件(form.password_repeat,{'attr':{'class':'col-md-2'}}}}}
{{form_错误(form.password_重复,{'attr':{'class':'col-md-3'}}}}}
有什么想法吗?您需要在表单中添加
\u标记,即
{{ form_row(form._token) }}
到目前为止,您的表单缺少CSRF令牌字段。如果您使用twig表单函数来呈现表单,如表单(表单)
,这将自动为您呈现CSRF令牌字段,但您的代码显示您正在使用原始HTML呈现表单,如
,因此您必须手动呈现该字段
或者,只需在表单的结束标记之前添加{{form_rest(form)}}
根据文件
这将渲染所有尚未为给定对象渲染的字段
形式。这是一个好主意,总是有这个地方在你的形式
因为它将为您呈现隐藏字段,并生成您忘记的任何字段
渲染更明显(因为它将为您渲染字段)
在您的
标签放置之前:
{{ form_rest(form) }}
它将自动插入其他重要(隐藏)输入。这是因为表单默认包含CSRF保护,在某些情况下不需要保护
您可以在getDefaultOptions
方法中禁用表单类中的CSRF保护,如下所示:
// Other methods omitted
public function getDefaultOptions(array $options)
{
return array(
'csrf_protection' => false,
// Rest of options omitted
);
}
<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
<!-- Code omitted -->
<div class="form-group">
<div class="col-md-1 control-label">
<input type="submit" value="submit">
</div>
</div>
{{ form_rest(form) }}
</form>
<form>
<!-- all my form fields... -->
</form>
<input type="hidden" id="item__token" name="item[_token]" value="SQAOs1xIAL8REI0evGMjOsatLbo6uDzqBjVFfyD0PE4" />
</form>
127.0.0.1 foobar
如果不想禁用CSRF保护,则需要在表单中呈现CSRF protecion字段。可以通过在视图文件中使用{{form\u rest(form)}}
来完成,如下所示:
// Other methods omitted
public function getDefaultOptions(array $options)
{
return array(
'csrf_protection' => false,
// Rest of options omitted
);
}
<form novalidate action="{{path('signup_index')}}" method="post" {{form_enctype(form)}} role="form" class="form-horizontal">
<!-- Code omitted -->
<div class="form-group">
<div class="col-md-1 control-label">
<input type="submit" value="submit">
</div>
</div>
{{ form_rest(form) }}
</form>
<form>
<!-- all my form fields... -->
</form>
<input type="hidden" id="item__token" name="item[_token]" value="SQAOs1xIAL8REI0evGMjOsatLbo6uDzqBjVFfyD0PE4" />
</form>
127.0.0.1 foobar
{{form_rest(form)}
{{form\u rest(form)}
呈现所有未手动输入的字段。以防您不想使用form\u行或form\u rest,只想访问细枝模板中的_标记值。使用以下命令:
<input type="hidden" name="form[_token]" value="{{ form._token.vars.value }}" />
当表单包含大量元素时,也可以看到此错误消息
php.ini中的此选项是导致问题的原因
; How many GET/POST/COOKIE input variables may be accepted
max_input_vars = 1000
问题是_令牌字段未命中PUT(GET)请求,所以必须增加值
此外,它还涉及到一个大文件。增加
upload_max_filesize
选项将解决问题。使用引导时,这似乎是一个问题,除非您通过{{form(form)}呈现表单。此外,问题似乎只发生在输入type=“hidden”上。如果使用表单检查页面,您会发现隐藏的输入根本不是标记的一部分,或者它正在呈现,但由于某种原因没有提交。正如上面所建议的,添加{form_rest(form)}或像下面这样包装输入就可以了
<div class="form-group">
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
</div>
在我的例子中,实体中的maxSize注释出现问题,因此我将其从2048增加到20048
/**
* @Assert\File(
* maxSize = "20048k",
* mimeTypes = {"application/pdf", "application/x-pdf"},
* mimeTypesMessage = "Please upload a valid PDF"
* )
*/
private $file;
希望这个答案有帮助 除了其他人的建议之外,如果会话存储不工作,您还可能出现CSRF令牌错误
在最近的一个案例中,我的一位同事将“session_prefix”更改为一个包含空格的值
session_prefix: 'My Website'
会话存储中断,这反过来意味着我的表单无法从会话中获取CSRF令牌。如果您已将表单从纯HTML转换为twig,请确保您没有错过删除结束标记。愚蠢的错误,但正如我发现的,这可能是这个问题的原因
当我遇到这个错误时,一开始我无法理解。我正在使用form\u start()
和form\u end()
来生成表单,因此我不必使用form\u行(form.\u token)
显式添加令牌,或者使用form\u rest()
来获取它
问题是,我使用的视图是一个从纯HTML转换为twig的视图,我没有删除结束标记
,因此没有:
{{ form_end(form) }}
我有:
</form>
{{ form_end(form) }}
显然,解决方案是删除额外的结束标记,也许再多喝点咖啡。我有一个奇怪的行为:清除浏览器缓存并不能解决问题,但清除cookie(即PHP会话ID cookie)确实解决了问题
这必须在您检查所有其他答案后完成,包括验证您是否在隐藏表单输入字段中有令牌。我最近遇到此错误。事实证明,我的cookie设置在config.yml中不正确。将cookie\u路径
和cookie\u域
设置添加到framework.session
修复了它。我遇到了类似的问题。确保令牌字段实际呈现后(请参阅接受的答案),我检查了我的cookie。
我的Chrome浏览器中有2(!)个域cookie,显然是因为我在与另一个应用程序相同的域上运行应用程序,但使用不同的端口(即mydomain.com在mydomain.com上运行有bug的应用程序时设置了原始cookie:123)
现在很明显Chrome发送了错误的cookie,所以CSR