Отключить защиту токена Symfony 2 csrf при отправке ajax

44

Я создаю мобильное приложение, разговаривающее с моим приложением symfony2 через webservices Я не могу найти способ отключить защиту csrf на определенном контроллере/действии

Я хочу отправить данные регистрации в это действие и использовать проверку формы sf2. Я не называю форму в своем мобильном приложении

Невозможно изменить параметры контейнера в действии, выдать исключение, потому что это замороженный параметр...

Я не хочу отключать защиту формы для всего моего приложения

любая подсказка?

спасибо!

обновление: с symfony 2.1.x

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));
}
  • 24
    $form = $this->createForm($formType, $entity, array('csrf_protection' => false));
  • 0
    Больше не изучал, но, используя тип формы в качестве службы, мне пришлось использовать решения SalmanPK, так как опция csrf_protection по умолчанию не была распознана.
Теги:
csrf

5 ответов

79
Лучший ответ

Если вы ищете немного более легкое и быстрое решение, чем предлагалось в ответе выше, вот как:

<?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.


Изменить: обновленный ответ на последнюю версию Symfony, спасибо naitsirch

  • 0
    Спасибо ! Я искал реализацию специального поставщика CSRF, как @jperovic, но ваше решение работает и чисто :)
  • 0
    Определенно более простое решение! :)
Показать ещё 6 комментариев
18

Используя форму factory

Для тех, кто хочет создать простую форму в контроллере:

$form = $this->container->get('form.factory')
    ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false))
    ->add('yourField','text', array(
        'label' => false,
        'mapped' => false
    ))
    ->getForm();
4
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'csrf_protection' => false,
    ]);
}
1

Используя форму factory в 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();

Адаптировано из ответа Мика

1

Я не могу быть на 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()
));

Я не пробовал это сам, но это похоже на возможное решение...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню