Disattivare symfony 2 token csrf, la protezione, l’ajax presentare

sto costruendo una mobile app parlando del mio symfony2 app tramite webservices
Non riesco a trovare un modo per disabilitare la protezione csrf su uno specifico controller/action

voglio postare dati di registrazione per questa azione e l’uso sf2 la validazione dei form. Io non chiamo la forma nella mia app mobile

Non è possibile modificare i parametri del contenitore in azione, lanciare un’eccezione, perché è un frozen parametro…

Non voglio disabilitare il modulo di protezione per tutta la mia applicazione

indizio ?

grazie !

aggiornamento: con 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));
  • Non indagare di più, ma con una forma tipo come servizio ho dovuto usare SalmanPK soluzioni dal default csrf_protection opzione non è stata riconosciuta.

 

5 Replies
  1. 86

    Se siete in cerca di un po ‘ più facile e più veloce soluzione di quanto suggerito nella risposta di cui sopra, ecco come:

    <?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,
            ));
        }
    }

    .. o se stai usando le versioni più vecchie (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;
        }
    }

    Consultare il Documentazione Symfony per ulteriori informazioni.


    Edit: aggiornato risposta alla ultima versione di Symfony, grazie
    naitsirch

    • Grazie ! stavo cercando di implementare un custom csrf come fornitore di @jperovic, ma la tua soluzione funziona, ed è pulito 🙂
    • Sicuramente la soluzione più semplice! 🙂
    • manca un disableCSRFProtection() metodo come un symfony 1. Davvero comodo in ajax contesto
    • È il momento di aggiungere il nuovo >=2.7 metodo di sostituzione getDefaultOptions
    • >=2.7: configureOptions(OptionsResolver $resolver)
    • grazie, risolto
    • Il primo frammento (configureOptions) opere in Symfony 4.
    • Mi sono permesso di riscrivere “o se si sta utilizzando Symfony 2.0” in qualcosa di più esplicito di oggi (Senza dubbio al momento della scrittura di questo era chiaro, ma oggi non ho saputo leggendo considerando che era il significato di “vecchie versioni” o “nuove versioni”). Sentitevi liberi di accettare / modificare / ripristinare la mia modifica.

  2. 20

    Utilizzando il modulo di fabbrica

    Per chi vuole creare una forma semplice di un controllore:

    $form = $this->container->get('form.factory')
        ->createNamedBuilder(null, 'form', null, array('csrf_protection' => false))
        ->add('yourField','text', array(
            'label' => false,
            'mapped' => false
        ))
        ->getForm();
  3. 7
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'csrf_protection' => false,
        ]);
    }
    • Grazie, ha funzionato per Symfony 4 app. Nel mio caso ho messo questo codice nel file src/Form/MovieType.php
  4. 2

    Utilizzando il modulo di fabbrica, in 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();

    Adattato da Mick risposta

  5. 1

    Non posso essere sicuro al 100% ma credo di aver letto da qualche parte che è possibile passare csrf_provider opzione durante la creazione della forma.

    Tutti i provider sono sottotipi di interfaccia Symfony\Component\Form\Extension\Csrf\CsrfProvider e si dovrebbe essere in grado di creare il vostro proprio:

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

    e nel controller:

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

    Non ho provato io stesso, ma questo suona come una possibile soluzione…

Lascia un commento