Symfony3 中的错误“CSRF 令牌无效。请尝试重新提交表单”

Posted

技术标签:

【中文标题】Symfony3 中的错误“CSRF 令牌无效。请尝试重新提交表单”【英文标题】:Error "The CSRF token is invalid. Please try to resubmit the form" in Symfony3 【发布时间】:2017-08-01 00:49:16 【问题描述】:

问题

FOS 用户捆绑表单(登录、注册、...)工作得很好,但不是我自己的表单,给我:

CSRF 令牌无效。请尝试重新提交表单

当我尝试在以下位置创建资源时:

http://www.project.local/app_dev.php/developer/new

甚至:

http://www.project.local/developer/new

环境

OS X EL Capitan 64 位 网络服务器: 服务器:Apache 2.4.16 服务器 API:Apache 2.0 处理程序 (mod_php7) 线程安全:禁用 文档根目录:/Library/WebServer/Documents/project/web PHP:7.1.2 Symfony:3.2.* 使用生成的代码库 $ symfony new project $ php app/console generate:doctrine:crud FOS 用户包:~2.0@dev KNP 菜单包:^2.0

app/config/config.yml

framework:
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:       enable_annotations: true 
    #serializer:      enable_annotations: true 
    templating:
        engines: ['twig']
    trusted_hosts:   ~
    trusted_proxies: ~
    session:
        handler_id:  session.handler.native_file
        save_path:   "%kernel.root_dir%/../var/sessions/%kernel.environment%"

    fragments:       ~
    http_method_override: true

# Twig Configuration
twig:
    debug:            "%kernel.debug%"
    strict_variables: "%kernel.debug%"
    form_themes:
        - 'form/form_div_layout.html.twig'

app/config/security.yml

security:
    providers:
        fos_userbundle:
            id: fos_user.user_provider.username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_token_generator: security.csrf.token_manager

开发者控制器

public function newAction(Request $request)

    $developer = new Developer();
    $form = $this->createForm(DeveloperType::class, $developer);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) 
        $em = $this->getDoctrine()->getManager();
        $em->persist($developer);
        $em->flush($developer);

        return $this->redirectToRoute('developer_show', array('id' => $developer->getId()));
    

    return $this->render('BackendBundle:Developer:new.html.twig', array(
        'developer' => $developer,
        'form' => $form->createView(),
    ));

开发者类型

class DeveloperType extends AbstractType

    public function buildForm(FormBuilderInterface $builder, array $options) 
        $builder->add('user');
    

    public function configureOptions(OptionsResolver $resolver) 
        $resolver->setDefaults(array(
            'data_class' => Developer::class
        ));
    

    public function getBlockPrefix() 
        return 'backendbundle_developer';
    

表单 - 模板

 form_start(form) 
 form_widget(form) 
<button type="submit" name=" form.vars.name ">Create</button>
 form_end(form) 

表单 - 生成

表单始终具有隐藏的_token 输入字段存在

<form name="form_name" method="post" class="ui form">
    <input type="hidden" name="form_name[_token]" value="YefVvhSvvNTItjw7ayDFwFi4sdf_6oOvsQjnUu9X7cw">
    <button type="submit" name="form_name">Create</button>
</form>

form_name 等于 backendbundle_developer

我做了什么?

    在 Google 上搜索了几个小时,并阅读了 Stack Overflow 上的所有类似问题,包括上述问题

    重新检查文件系统权限

    httpd 进程在_www 用户下运行,所以:

    sudo chown -R _www var/
    sudo chmod -R 775 var/
    

    var/sessions/下的会话文件创建更新成功

    更改了app/config/config.yml 条目

    session:
        handler_id: session.handler.native_file
        save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
    

    session:
        handler_id: session.handler.native_file
        save_path: ~
    

完全没有成功。

类似问题

这不是这些类似问题的重复:

symfony2 CSRF invalid

Symfony 3.0.1 CSRF token present but invalid

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

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

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

“The CSRF token is invalid” error in symfony 2 even using form_rest(form) function

Symfony isValid False CSRF token is invalid

Symfony 2. CSRF token is invalid

【问题讨论】:

【参考方案1】:

你应该改变这个

<button type="submit" name="form_name">Create</button>

有了这个

<button type="submit" name="form_name[submit]">Create</button>

【讨论】:

以上是关于Symfony3 中的错误“CSRF 令牌无效。请尝试重新提交表单”的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 令牌无效。请尝试重新提交表单。 Symfony 4

在测试中获取 CSRF 令牌

如何解决 Symfony3 中的 ServiceNotFoundException

添加新捆绑包时出现Symfony3错误

Symfony3 表单组件试图将 null 传递给 PHP 7 中的类型提示方法

Symfony3 / Nelmio cors / fetch api — 400 错误请求