如何摆脱Invalide CSRF令牌错误

时间:2016-01-29 15:35:22

标签: symfony

我有一个symfony表单。提交它,我有一条错误消息:

The CSRF token is invalid. Please try to resubmit the form.

我不知道为什么我有这个。检查请求方法后,我将请求绑定到表单:

if ($request->getMethod() === 'POST') {
        $form->handleRequest($request);
}

以下是表单的类型。

class PasswordActionType extends AbstractType {
protected $forgotten_password;

public function __construct($forgotten_password) {
    $this->forgotten_password = $forgotten_password;
}

public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder, array $options) {        
    $builder->add('identifiant', 'text', array('attr' => array('style' => 'width:250px')));

    if(!$this->forgotten_password) {
        $builder->add('ancienMDP', 'password', array(
            'label' => 'Ancien MDP', 
            'attr' => array(
                'class' => 'ligne', 
                'style' => 'width:252px'
        )));
        $builder->add('nouveauMDP', 'repeated', array(
            'type' => 'password',
            'invalid_message' => 'Confirmation différente du nouveau mot de passe',
            'first_options' => array('label' => 'Nouveau MDP'),
            'second_options' => array('label' => 'Confirmer'),
            'options' => array(
                'attr' => array(
                    'class' => 'ligne', 
                    'style' => 'width:252px'
            ))
        ));
    } else {
        $builder->add('ancienMDP', 'hidden', array('error_bubbling' => false, 'data' => 'NULL'));
        $builder->add('nouveauMDP', 'hidden', array('error_bubbling' => false, 'data' => 'NULL'));
    }
}

public function configureOptions(\Symfony\Component\OptionsResolver\OptionsResolver $resolver) {
    $resolver->setDefaults(array(
       'data_class' => 'My\Bundle\Security\PasswordAction',
       'csrf_protection' => true,
       'csrf_field_name' => 'token'
    ));
}

public function getName() {
    return 'cramif_password_action';
}

}

所以2个表单使用相同的构建器。区别在于“forgotten_password”的值。

form1:forgotten_password = true

2个字段'ancienMDP'和'NouveauMDP'是隐藏的html字段

form2:forgotten_password = false

这两个领域是你能看到的。

form1没有问题,没有CSRF错误。

form2会出现问题。

注意:2个表单与Twig一起显示,命令相同。

注意2:在twig模板中,我有一个form_rest

1 个答案:

答案 0 :(得分:0)

只是为了帮助别人:

如果你认为你做得对:

  • 在检查表单已发布后绑定请求

  • 使用了form_rest。

检查您是否未使会话无效。当然,要使CSRF正常工作,您需要一个有效的会话。