Symfony2 防止多个表单提交

Bil*_*il5 4 forms submit csrf symfony

我正在使用 Symfony2 处理表单。我有一些实体字段和一个 csrf 令牌,由于{{ form_rest(myform) }}.

问题是 :

  1. 用户填写表单并点击提交按钮(然后发布表单)
  2. 用户快速按下退出键
  3. 用户再次点击提交按钮(表单再次发布)

结果:一个实体(表单绑定到一个实体)在数据库中插入了两次

这可以无限发生

我认为使用 CSRF 令牌字段可以防止这种情况,但事实并非如此。那么有没有什么办法可以用 Symfony 框架在本地解决这个问题呢?如果不是,存在哪些可能性?

先感谢您!

bar*_*892 9

我不确定这是否是正确的方法,但您可以执行以下操作。

在您的 中FormType,设置以下选项:

对于 Symfony < 4 使用intention

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
        // important part; unique key
        'intention'       => 'form_intention',
    ]);
}
Run Code Online (Sandbox Code Playgroud)

对于 Symfony >= 4 使用csrf_token_id

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'csrf_protection' => true,
        'csrf_field_name' => '_token',
        // important part; unique key
        'csrf_token_id'   => 'form_intention',
    ]);
}
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器操作中,您可以使用您的intention或执行以下操作csrf_token_id

if ($form->isSubmitted()) {
    // refresh CSRF token (form_intention)
    $this->get("security.csrf.token_manager")->refreshToken("form_intention");
}
Run Code Online (Sandbox Code Playgroud)

这可以防止给定表单的双重提交。