2012-03-27 10 views
43

मैं मैं एक विशिष्ट नियंत्रक पर CSRF सुरक्षा को निष्क्रिय करने के लिए एक रास्ता नहीं मिल रहा है webservices के माध्यम से मेरी symfony2 एप्लिकेशन से बात कर एक मोबाइल एप्लिकेशन के निर्माण कर रहा हूँ/कार्रवाईअक्षम सिम्फोनी 2 CSRF ajax पर टोकन सुरक्षा

मैं चाहता प्रस्तुत इस कार्रवाई में पंजीकरण डेटा पोस्ट करने और एसएफ 2 फॉर्म सत्यापन का उपयोग करने के लिए। मैं अपने मोबाइल एप्लिकेशन में प्रपत्र कॉल नहीं करते

, कार्रवाई में कंटेनर मानकों को बदल नहीं सकते एक अपवाद फेंक, क्योंकि यह एक जमे हुए पैरामीटर है ...

मैं पूरे के लिए प्रपत्र सुरक्षा को अक्षम नहीं करना चाहती मेरी आवेदन

कोई सुराग?

धन्यवाद!

अद्यतन: सिम्फोनी 2.1.x

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

'$ प्रपत्र = $ this-> createForm ($ formType, $ इकाई, सरणी ('csrf_protection' => गलत)) से अनुकूलित;' –

+0

नहीं आया अधिक जांच नहीं करें लेकिन एक सेवा के रूप में एक फॉर्म प्रकार का उपयोग करके मुझे सलमानपीके के समाधानों का उपयोग करना पड़ा क्योंकि डिफ़ॉल्ट csrf_protection विकल्प को पहचाना नहीं गया था। – tuxone

उत्तर

78

यदि आप उपर्युक्त उत्तर में सुझाए गए सुझावों की तुलना में थोड़ा आसान और तेज़ समाधान ढूंढ रहे हैं, तो यहां बताया गया है:

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

+0

धन्यवाद! मैं @jperovic की तरह एक कस्टम CSRF प्रदाता को लागू करने के लिए देख रहा था, लेकिन अपने समाधान काम करता है और साफ :) –

+0

निश्चित रूप से सरल समाधान है! [: 'ConfigureOptions (OptionsResolver $ समाधानकर्ता)'> = 2.7] (http :) –

+0

एक सिम्फोनी की तरह एक disableCSRFProtection() विधि लापता 1. सच ajax संदर्भ –

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

मैं इस प्रयास नहीं किया है, लेकिन इस तरह लगता है एक संभावित समाधान ...

18

जो एक नियंत्रक में एक सरल रूप बनाना चाहते हैं प्रपत्र कारखाने

का उपयोग करना:

$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

टी का उपयोग करना वह 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(); 

मिक के जवाब

संबंधित मुद्दे