source

Ajax 제출 시 symfony 2 CSRF 토큰 보호 사용 안 함

gigabyte 2023. 2. 14. 21:27
반응형

Ajax 제출 시 symfony 2 CSRF 토큰 보호 사용 안 함

웹 서비스를 통해 내 symfony2 앱과 대화하는 모바일 앱을 구축하고 있는 중 특정 컨트롤러/액션에서 CSRF 보호를 비활성화하는 방법을 찾을 수 없습니다.

이 액션에 등록 데이터를 투고하고 sf2 폼 검증을 사용하고 싶습니다.모바일 앱에서 양식을 호출하지 않음

컨테이너 매개 변수를 변경할 수 없습니다. 고정된 매개 변수이므로 예외를 발생시킵니다...

응용 프로그램 전체에 대해 양식 보호를 사용하지 않도록 설정하지 않음

단서는?

고마워!

업데이트: symfony 2.1.x 사용

/**
 * {@inheritdoc}
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection'   => false,
    ));
}

위의 답변보다 조금 더 쉽고 빠른 솔루션을 찾고 있다면 다음과 같이 하십시오.

<?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 감사합니다.

폼 팩토리 사용

컨트롤러에 간단한 폼을 작성하는 경우:

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

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();

Mick의 답변에서 개작

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()
));

저도 해보진 않았지만 이건 가능한 해결책처럼 들리는데...

언급URL : https://stackoverflow.com/questions/9887451/disable-symfony-2-csrf-token-protection-on-ajax-submit

반응형