2010-04-05 27 views
7

क्या कोई मुझे बता सकता है कि सिम्फनी 1.4 में फॉर्म के लिए सीएसआरएफ टोकन त्रुटि संदेश को कस्टमाइज़ करने के लिए कहां/कैसे अनुकूलित किया जाए। मैं लॉग इन के लिए sfDoctrineGuard का उपयोग कर रहा हूं और इस रूप में, विशेष रूप से, जब भी कोई सत्र समाप्त हो जाता है और आपके पास अभी भी पृष्ठ खुलता है, तो यह बहुत उपयोगकर्ता-असंगत त्रुटि फेंकता है: "सीएसआरएफ हमले का पता चला"। कुछ "इस सत्र की समयसीमा समाप्त हो गई है। कृपया होम पेज पर वापस आएं और पुनः प्रयास करें" बेहतर लगता है।सिम्फनी 1.4: सीएसआरएफ के लिए कस्टम त्रुटि संदेश

फॉर्म क्लास में ऐसा करने का सही तरीका क्या है?

धन्यवाद।

उत्तर

5

एकमात्र तरीका sfForm::addCSRFProtection() को ओवरराइट करना प्रतीत होता है।

/lib/form/BaseForm.class.php में आप कोड के इस टुकड़े जोड़ सकते हैं:

class BaseForm extends sfFormSymfony 
{ 
    public function addCSRFProtection($secret = null) 
    { 
     parent::addCSRFProtection($secret); 
     if (array_key_exists(self::$CSRFFieldName, $this->getValidatorSchema())) { 
      $this->getValidator(self::$CSRFFieldName)->setMessage('csrf_attack', 'This session has expired. Please return to the home page and try again.'); 
     } 
    } 
} 

माता पिता विधि बुला के बाद, आप CSRF क्षेत्र से जुड़े सत्यापनकर्ता निकालते हैं और कोड csrf_attack के लिए संदेश बदल जाते हैं।

संपादित करें: आपको यह भी जांचना होगा कि वैधकर्ता मौजूद है या नहीं। कुछ रूपों में उनके सीएसआरएफ संरक्षण अक्षम हो सकते हैं!

आशा है कि इससे मदद मिलती है!

+0

@naag: बहुत बहुत धन्यवाद। कुछ चीजों की कोशिश की लेकिन वह नहीं, एक खेल होगा। सिम्फनी लोगों से मामूली निगरानी की तरह लगता है। – Tom

+0

मैंने सीएसआरएफ सत्यापनकर्ता के अस्तित्व के लिए एक चेक शामिल करने के लिए अपना उत्तर संपादित किया :-) – naag

2

1.4.4 में मैं तो जैसे नाग के कोड को संशोधित करने के लिए किया था ...

public function addCSRFProtection($secret = null) 
{ 
    parent::addCSRFProtection($secret); 
    if (isset($this->validatorSchema[self::$CSRFFieldName])) { 
    $this->validatorSchema[self::$CSRFFieldName]->setMessage('csrf_attack', 'This session has expired. Please refresh and try again.'); 
    } 
} 

यह यह काम कर रहा है, 'CSRF टोकन:' सा अभी भी त्रुटि संदेश में हालांकि प्रकट होता है।

1

ईवेंट प्रेषक का उपयोग करें। इसे देखें http://bluehorn.co.nz/2010/07/15/how-to-change-csrf-attack-message-in-symfony-1-2/

मैंने इसे सिम्फनी 1.2 के लिए लिखा, लेकिन ईवेंट प्रेषक का उपयोग करके, यह अभी भी सिम्फनी 1.4 के लिए काम कर सकता है।

1

मुझे लगता है कि "सीएसआरएफ टोकन:" उपसर्ग को सीएसआरएफ टोकन क्षेत्र के लेबल को सेट करके हटाया जा सकता है या अनुकूलित किया जा सकता है।

3

इनमें से कोई भी जवाब "सीएसआरएफ टोकन:" लेबल को हटाने का तरीका बताता है जो त्रुटि संदेश को गैर-हैकिश तरीके से उपसर्ग करता है (उदाहरण के लिए टोकन नाम बदलना एक बुरा विचार है!)।

लेबल को हटाने का एकमात्र ध्वनि तरीका वैश्विक त्रुटि को फेंकने के लिए सीएसआरएफ सत्यापनकर्ता का विस्तार करना है। जबकि हम ऐसा करते हैं, हम त्रुटि संदेश भी बदल सकते हैं।

class myValidatorCSRFToken extends sfValidatorCSRFToken 
{ 
    protected function configure($options = array(), $messages = array()) 
    { 
    parent::configure($options, $messages); 
    $this->addMessage('csrf_attack', 'Your session has expired. Please return to the home page and try again.'); 
    } 

    protected function doClean($value) 
    { 
    try { 
     return parent::doClean($value); 
    } catch (sfValidatorError $e) { 
     throw new sfValidatorErrorSchema($this, array($e)); 
    } 
    } 
} 

अब, चलो हमारे रूपों BaseForm में sfForm::addCSRFProtection अधिभावी द्वारा इस सत्यापनकर्ता उपयोग करने के लिए सेट कर सकते हैं:

public function addCSRFProtection($secret = null) 
{ 
    parent::addCSRFProtection($secret); 
    if (isset($this->validatorSchema[self::$CSRFFieldName])) //addCSRFProtection doesn't always add a validator 
    { 
    $this->validatorSchema[self::$CSRFFieldName] = new myValidatorCSRFToken(array(
     'token' => $this->validatorSchema[self::$CSRFFieldName]->getOption('token') 
    )); 
    } 
} 
2

पिछले उत्तरों के सुधार, यहाँ कोड मैं का उपयोग करें:

public function addCSRFProtection($secret = null) 
    { 
    parent::addCSRFProtection($secret); 
    if (isset($this->validatorSchema[self::$CSRFFieldName])) { 
     $this->validatorSchema[self::$CSRFFieldName]->setMessage('csrf_attack', 'This session has expired. Please refresh and try again.'); 
     $this->getWidgetSchema()->getFormFormatter()->setNamedErrorRowFormatInARow(" <li>%error%</li>\n"); 
    } 
    } 

NamedErrorRowFormatInARow के लिए डिफ़ॉल्ट मान "<li>%name%: %error%</li>\n" नाम और कॉलन जोड़ रहा है। सावधान रहें क्योंकि यह सभी रूपों और सभी वैश्विक त्रुटियों के मान को बदलता है।

आप एक कस्टम फॉर्म फॉर्मेटर बनाकर और इसे इच्छित रूपों में उपयोग करके फ़ील्ड भी बदल सकते हैं।इस पर अधिक जानकारी के लिए आप the documentation here पर जा सकते हैं।

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