symfony - 使用 symfony2 表单类型的 CSRF 无效

标签 symfony csrf

我在一个操作中创建 2 个表单,这些表单由 jquery ajax 提交给其他 2 个操作。现在,问题是 - 只有第一种形式有效。编辑表单抛出 csrf token 无效。为什么会发生这种情况?我的代码:

创建表单:

$project = new Project();
      $addProjectForm = $this->createForm(new AddProjectType(), $project, [
        'action' => $this->generateUrl('tfpt_portfolio_versionhistory_addproject'),
        'method' => 'POST',
        'attr' => ['id' => 'newProjectForm']
      ]);
      $editProjectForm = $this->createForm(new EditProjectType(), $project, [
        'action' => $this->generateUrl('tfpt_portfolio_versionhistory_editproject'),
        'method' => 'POST',
        'attr' => ['id' => 'editProjectForm']
      ]);

处理提交编辑表单(但添加表单几乎相同):

$project = new Project();
      $form = $this->createForm(new EditProjectType(), $project);

      $form->handleRequest($request);
      if($form->isValid()){
        //handle form
      }
}

这两种表单之间的唯一区别是编辑表单多了一个字段 - 隐藏 ID。两者都是通过 jquery 提交的,如下所示:

var form = $("#editProjectForm")
            if(form.valid()){
                $("#loader").show();
                $.ajax({
                    type: form.attr('method'),
                    url: form.attr('action'),
                    data: form.serialize()
                }).done(function(data){
                       //result
                            }
                        });

我显示这样的表单:

 {{ form_start(editProjectForm) }}
 {{ form_errors(editProjectForm) }}
 {{ form_widget(editProjectForm.name) }}
 {{ form_widget(editProjectForm.id) }}
 {{ form_rest(editProjectForm) }}
 {{ form_end(editProjectForm) }}

有人可以指出我的错误吗?是否可以在一个 Action 中嵌入 3 个表单?或者我必须以其他方式生成 CSRF?

@Edit:我将 symfony 更新到了最新版本,现在它可以正常工作了。似乎这个版本有一个错误,或者我缺少供应商代码。不管怎样,问题已经解决了。

最佳答案

我认为您必须在 Controller 中创建两个 token :

$token_add = $this->get('form.csrf_provider')->generateCsrfToken('add');

$token_edit = $this->get('form.csrf_provider')->generateCsrfToken('edit');

并将 View 放入隐藏字段中。然后在处理表单的 Controller 操作中进行验证

# Here you can validate the 'add' or 'edit' token
if (!$this->get('form.csrf_provider')->isCsrfTokenValid('add', $token)) {

    $respuesta = array('mensaje' => 'Oops! Invalid token.',
                       'token' => $token);
    return new Response(json_encode($respuesta));
}

关于symfony - 使用 symfony2 表单类型的 CSRF 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19542641/

相关文章:

symfony - 用Twig在for循环内创建一个数组

php - Behat 3 - 如何在上下文中检索自定义扩展

django - 我需要没有用户或登录的 CSRF 保护吗?

ruby-on-rails - Devise + Omniauth [警告: Can't verify CSRF token authenticity]

php - 为什么我的 symfony 路由不起作用?

php - 在移动设备上将当前 div 置于 Bootstrap 进度条的中心

php - 在每个 Controller 中处理相同的 try catch 结构

php - Laravel Dingo API 和 Middleware\\VerifyCsrfToken.php 问题

angularjs - 使用 CSRF_COOKIE_HTTPONLY 将 Django CSRF token 传递给 Angular

node.js - Csurf 无效的 csrf token Express/nodejs