2011-12-11 3 views
0

각 페이지에는 CSRF 보호를위한 Zend_Form_Element_Hash가있는 3 개의 양식이 포함되어 있습니다.Zend Hash 세션 변수가 양식 제출 후 손실

문제는 그 중 2 개가 CSRF와 잘 작동하지만 다른 하나는 해시에 문제가 있다는 것입니다.

처음 제출할 때 "missingToken"오류가 반환됩니다. (보기에서

: 다시 제출하려고하면 그 후, 그것은

내가 무슨 일이 있었는지 볼 수있는 위해서 var_dump ($ _ SESSION)를 만들어 출력이 있었다 .... 잘 작동 양식)를 만들 때 :

array(7) { 
... 
    ["__ZF"]=> 
    array(3) { 
     ["Zend_Form_Element_Hash_routeSearch_csrf"]=> 
     array(2) { 
      ... 
     } 
     ["Zend_Form_Element_Hash_registration_csrf"]=> 
     array(2) { 
      ... 
     } 
     ["Zend_Form_Element_Hash_login_csrf"]=> 
     array(2) { 
      ... 
     } 
    } 
    ["Zend_Form_Element_Hash_routeSearch_csrf"]=> 
    array(1) { 
     ["hash"]=> 
     string(32) "2e348e982e5d8849a7bcb3f42fdd6c0d" 
    } 
    ["Zend_Form_Element_Hash_registration_csrf"]=> 
    array(1) { 
     ["hash"]=> 
     string(32) "6fd74223bb158cc3cc780ee29b26ae58" 
    } 
    ["Zend_Form_Element_Hash_login_csrf"]=> 
    array(1) { 
     ["hash"]=> 
     string(32) "d07dc1ac514082f1960c300670414399" 
    } 
} 

을 한 후 제출

array(6) { 
... 
    ["__ZF"]=> 
    array(2) { 
     ["Zend_Form_Element_Hash_login_csrf"]=> 
     array(2) { 
      ... 
     } 
     ["Zend_Form_Element_Hash_routeSearch_csrf"]=> 
     array(2) { 
      ... 
     } 
    } 
    ["Zend_Form_Element_Hash_login_csrf"]=> 
    array(1) { 
     ["hash"]=> 
     string(32) "d07dc1ac514082f1960c300670414399" 
    } 
    ["Zend_Form_Element_Hash_routeSearch_csrf"]=> 
    array(1) { 
     ["hash"]=> 
     string(32) "b9378bec2fd18cf232f451ed602acf0a" 
    } 
} 

보시다시피, "Zend_을 Form_Element_Hash_registration_csrf "가 사라졌습니다.

내가 아는 모든 것을 시도했지만 세션을 사라지게 만들 수있는 것을 찾지 못했습니다 ... 어떤 아이디어입니까? 젠드가 뭘 할 수 있었 니?

덧붙여서, 2 개의 폼이 같은 Controller에 의해 다른 Action로로드됩니다 (그 중 1 개가 문제가있는 폼입니다). 세션이 사라지는 이유가 될 수 있습니까?

더 이상 문제를 찾기 위해 무엇을해야할 지 모르겠으니 도움주세요. 여기 붙어 있네. = S.

은 ------ 수정 ------

좋아, 나는 ... 문제가 발생할 때 양식의, Ajax 요청을하고 있다는 것입니다 어떤이의 원인 발견 CSRF 해시가 만료됩니다 (홉 = 1).

누구나 CSRF + AJAX 호출이있는 양식을 사용하는 해결책을 알고 있습니까?

답변

0

좋아, 나는이 대신의 반복을 방지하기 위해 내 폼 클래스

에 그것을 만드는 양식을 보여줍니다 작업과 데이터베이스에 저장하기 전에 유효성을 검사하는 작업에 CSRF 요소를 추가 해결 양식을 보여줍니다 작업에, 그리고

class Application_Model_CSRF{ 

    public static function createCSRF($form, $csrf_salt_name, $field_name="csrf") { 
     $element=$form->createElement('hash', $field_name,array(
      'salt' => $csrf_salt_name 
     )); 
     //Create unique ID if you need to use some Javascript on the CSRF Element 
     $element->setAttrib('id',$form->getName().'_'.$element->getId()); 
     $form->addElement($element); 
     return $element; 
    } 

} 

과 유효성을 검사 상대방의 행동에,이 코드를 사용합니다 : 코드,이 클래스를 생성

$form = new Application_Form_Account_Registration(); 
Application_Model_CSRF::createCSRF($form,"registration");