在 ajax 提交时禁用 symfony 2 csrf 令牌保护

Posted

技术标签:

【中文标题】在 ajax 提交时禁用 symfony 2 csrf 令牌保护【英文标题】:Disable symfony 2 csrf token protection on ajax submit 【发布时间】:2012-04-10 20:40:08 【问题描述】:

我正在构建一个通过网络服务与我的 symfony2 应用程序对话的移动应用程序 我找不到在特定控制器/操作上禁用 csrf 保护的方法

我想将注册数据发布到此操作并使用 sf2 表单验证。我没有在我的移动应用中调用表单

无法在操作中更改容器参数,抛出异常,因为它是一个冻结参数...

我不想为整个应用程序禁用表单保护

有什么线索吗?

谢谢!

更新:使用 symfony 2.1.x

/**
 * @inheritdoc
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)

    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));

【问题讨论】:

$form = $this->createForm($formType, $entity, array('csrf_protection' => false)); 没有进行更多调查,但使用表单类型作为服务我不得不使用 SalmanPK 的解决方案,因为无法识别默认的 csrf_protection 选项。 【参考方案1】:

如果您正在寻找比上述答案中建议的更简单、更快速的解决方案,方法如下:

<?php

// ...

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyType extends AbstractType

    // ...

   public function configureOptions(OptionsResolver $resolver)
    
        $resolver->setDefaults(array(
            'csrf_protection' => false,
        ));
    

.. 或者如果您使用的是旧版本 (Symfony 2.0.*):

<?php

// ...

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class MyType extends AbstractType

    // ....

    public function getDefaultOptions(array $options)
    
        $options = parent::getDefaultOptions($options);
        $options['csrf_protection'] = false;

        return $options;
    

更多信息请咨询Symfony documentation。


编辑:更新了 Symfony 最新版本的答案,感谢 naitsirch

【讨论】:

谢谢!我正在寻找实现像@jperovic 这样的自定义 csrf 提供程序,但是您的解决方案有效并且很干净 :) 绝对更简单的解决方案! :) 缺少像 symfony 1 这样的 disableCSRFProtection() 方法。在 ajax 上下文中非常方便 是时候添加新的 >=2.7 方法来替换 getDefaultOptions 我允许自己在今天更明确地重写“或者如果你使用 Symfony 2.0”(毫无疑问,在写这篇文章的时候这很清楚,但今天我在阅读时不知道,而它的意思是“旧版本”或“新版本”)。随意接受/修改/恢复我的编辑。【参考方案2】:

使用表单工厂

对于那些想要在控制器中创建简单表单的人:

$form = $this->container->get('form.factory')
    ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false))
    ->add('yourField','text', array(
        'label' => false,
        'mapped' => false
    ))
    ->getForm();

【讨论】:

【参考方案3】:
public function configureOptions(OptionsResolver $resolver)

    $resolver->setDefaults([
        'csrf_protection' => false,
    ]);

【讨论】:

谢谢,它适用于 Symfony 4 应用程序。就我而言,我将此代码放入文件src/Form/MovieType.php【参考方案4】:

在 Symfony 3 中使用表单工厂

use Symfony\Component\Form\Extension\Core\Type\FormType;

$form = $this->container->get('form.factory')
    ->createNamedBuilder(null, FormType::class, null, array('csrf_protection' => false))
    ->add('yourField','text', array(
        'label' => false,
        'mapped' => false
    ))
    ->getForm();

改编自米克的回答

【讨论】:

【参考方案5】:

我不能 100% 确定,但我想我在某处读到您可以在创建表单时传递 csrf_provider 选项。

所有提供程序都是接口Symfony\Component\Form\Extension\Csrf\CsrfProvider 的子类型,您应该能够创建自己的:

class MyNonCsrfProvider extends DefaultCsrfProvider
    public function isCsrfTokenValid($intention, $token)
    
        return true;
    

在控制器中:

$this->createForm(new CustomFormType(), array(
    'csrf_provider' => new MyNonCsrfProvider()
));

我自己没有尝试过,但这听起来像是一个可能的解决方案......

【讨论】:

以上是关于在 ajax 提交时禁用 symfony 2 csrf 令牌保护的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 2 中 login_check 后禁用重定向

symfony2 安全 - 禁用登录路径并显示禁止

有啥方法可以禁用 symfony 2 中某些控制器的会话?

使用 ajax 提交 symfony 3 表单

如何在 symfony2 中提交表单 ajax?

在 Symfony 5 中验证 AJAX 提交的表单