重置密码时无效的CSRF令牌

时间:2018-09-24 16:01:34

标签: symfony fosuserbundle

我的网站上有一个重置密码功能,但是,表格无法正常工作。尝试设置密码时,显示“无效的CSRF令牌”。

这是我的实际重置密码表格:

<div class="login-form">
            <form name="fos_user_resetting_form" method="post" action="{{ path('fos_user_resetting_reset', {'token': token}) }}" class="needs-validation" novalidate>
                <div class="form-group">
                    <label for="fos_user_resetting_form_plainPassword_first" class="required">{{ 'form.password'|trans }}</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-key"></i></div>
                        <input type="password" class="form-control" id="fos_user_resetting_form_plainPassword_first" name="fos_user_resetting_form[plainPassword][first]" required="required" autocomplete="new-password" />
                        <div class="invalid-tooltip">Por favor, ingrese la nueva contraseña.</div>
                    </div>
                </div>
                <div class="form-group"> 
                    <label for="fos_user_resetting_form_plainPassword_second" class="required">{{ 'form.password_confirmation'|trans }}</label>
                    <div class="input-group">
                        <div class="input-group-addon"><i class="fa fa-key"></i></div>
                        <input type="password" class="form-control" id="fos_user_resetting_form_plainPassword_second" name="fos_user_resetting_form[plainPassword][second]" required="required" autocomplete="new-password" />
                        <div class="invalid-tooltip" id="confirm_password_error">Por favor, ingrese la nueva contraseña.</div>
                    </div>
                </div>
                <div>
                    <button type="submit" id="_submit" name="_submit" class="btn btn-success btn-flat m-b-30 m-t-30">{{ 'resetting.reset.submit'|trans }}</button>
                </div>
            </form>
        </div>

我知道我需要在表单中添加_csrf_token隐藏输入,但是,如何?

我尝试过

            {% if csrf_token %}
                <input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
            {% endif %}

使用:

            {% if _token %}
                <input type="hidden" name="_csrf_token" value="{{ _token }}" />
            {% endif %}

使用:

<input type="hidden" id="fos_user_resetting_form__token" name="fos_user_resetting_form[_token]" value="{{ _token }}" />

以及其他尝试...但是没有任何效果。在所有情况下,都会显示小枝错误,并显示“变量“ _token”不存在”。

使用Symfony调试工具栏时,我清楚地看到该变量称为“ _token”。我不知道还能尝试什么。

编辑:看到Symfony Profiler时,将显示此内容。变量“ _token”确实存在,但是我找不到在视图中使用它的方法。

使用默认的FOSUserBundle表单时,呈现_token的值。我找不到它的实际呈现方式,因为它使用了{{form_widget(form)}},而且当我看到相应的Form Type时,我没有发现任何线索。

enter image description here

谢谢 海梅

3 个答案:

答案 0 :(得分:1)

最后,它比我想象的要容易。

我简单地添加了{{form_widget(form._token)}},其中令牌应位于表单中。这样,就为隐藏的输入字段呈现了正确的令牌值。

问候 海梅

答案 1 :(得分:0)

您尝试过以下吗?来自How to Implement CSRF Protection

<input type="hidden" name="_csrf_token"
    value="{{ csrf_token('authenticate') }}"
>

答案 2 :(得分:0)

对于试图添加csrf令牌而不生成整个表单的任何人,您都可以在树枝模板8/1/2018中使用。示例:

{{ fos_csrf_provider.refreshToken('resetting') }}