Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSRF令牌无效。请尝试重新提交表单_Php_Symfony_Twig - Fatal编程技术网

Php 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

每次尝试提交表单时,我都会收到以下错误消息:

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, '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