Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]formularze i csrf
Forum PHP.pl > Forum > PHP > Frameworki
prohol
witam

Mam problem z formularzami, tzn dokladniej z ochrona przez csrf. (symfony 1.2.4)

Przyusuwaniu kategori z formularza edycji dostaje blad o wymaganym csrf

500 | Internal Server Error | sfValidatorErrorSchema
_csrf_token [Required.]
stack trace
..

Formularze wygenerowalem za pomoca cli. Obecnie plik formluarza wyglada tak:
  1. <?php
  2. class BaseJmdataCategoriesForm extends BaseFormPropel
  3. {
  4.  public function setup()
  5.  {
  6.    
  7.    $this->setWidgets(array(
  8.      'id'    => new sfWidgetFormInputHidden(),
  9.      'name'  => new sfWidgetFormInput(),
  10.      'categories' => new sfWidgetFormPropelChoice(array('model'=>'JmdataCategories', 'add_empty'=> false)),
  11.      'link'  => new sfWidgetFormInput(),
  12.    ));
  13.  
  14.   /* $this->setValidators(array(
  15.       'id'    => new sfValidatorPropelChoice(array('model' => 'JmdataCategories', 'column' => 'id', 'required' => false)),
  16.       
  17.       'name'  => new sfValidatorString(array('max_length' => 150, 'required' => false)),
  18.       'link'  => new sfValidatorString(array('max_length' => 255, 'required' => false)),
  19.     ));
  20.     */
  21.  
  22.    $this->widgetSchema->setNameFormat('%s');
  23.    $this->disableCSRFProtection();
  24.  
  25.    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
  26.  
  27.    parent::setup();
  28.  }
  29.  
  30.  public function getModelName()
  31.  {
  32.    return 'JmdataCategories';
  33.  }
  34.  
  35. }
  36. ?>


Pliku JmdataCategoriesForm.class.php jest pusty, tzn bez dodatkowych ustawien itp.

Jak widac wylaczylem CSRFProtection oraz zakomentowalem validatory. Mimo to przy usuwaniu elementu dostaje powyzszy komunikat. Gdy wlacze CSRF to komunikat o wymaganym csrf token dostaje przy dodawaniu/edycji pol. Szukalem na forum symfony i nic nie pomagalo. Prosze o pomoc.
Lonas
A jak wygląda akcja usunięcia tej kategorii, poza tym po co to chcesz wyłączyć ?
prohol
Akcja jest z automatu (caly kod akcji poniewaz przy aktywacji CSRF za kazdym razem wyrzuca z walidatora "csrf token: Required". ):

  1. <?php
  2. class categoriesActions extends sfActions
  3. {
  4.  public function executeIndex(sfWebRequest $request)
  5.  {
  6.    $this->jmdata_categories_list = JmdataCategoriesPeer::doSelect(new Criteria());
  7.  }
  8.  
  9.  public function executeNew(sfWebRequest $request)
  10.  {
  11.    $this->form = new JmdataCategoriesForm();
  12.  }
  13.  
  14.  public function executeCreate(sfWebRequest $request)
  15.  {
  16.    $this->forward404Unless($request->isMethod('post'));
  17.  
  18.    $this->form = new JmdataCategoriesForm();
  19.  
  20.    $this->processForm($request, $this->form);
  21.  
  22.    $this->setTemplate('new');
  23.  }
  24.  
  25.  public function executeEdit(sfWebRequest $request)
  26.  {
  27.    $this->forward404Unless($jmdata_categories = JmdataCategoriesPeer::retrieveByPk($request->getParameter('id')), sprintf('Object jmdata_categories does not exist (%s).', $request->getParameter('id')));
  28.    $this->form = new JmdataCategoriesForm($jmdata_categories);
  29.  }
  30.  
  31.  public function executeUpdate(sfWebRequest $request)
  32.  {
  33.    $this->forward404Unless($request->isMethod('post') || $request->isMethod('put'));
  34.    $this->forward404Unless($jmdata_categories = JmdataCategoriesPeer::retrieveByPk($request->getParameter('id')), sprintf('Object jmdata_categories does not exist (%s).', $request->getParameter('id')));
  35.    $this->form = new JmdataCategoriesForm($jmdata_categories);
  36.    $this->processForm($request, $this->form);
  37.  
  38.    $this->setTemplate('edit');
  39.  }
  40.  
  41.  public function executeDelete(sfWebRequest $request)
  42.  {
  43.    $request->checkCSRFProtection();
  44.  
  45.    $this->forward404Unless($jmdata_categories = JmdataCategoriesPeer::retrieveByPk($request->getParameter('id')), sprintf('Object jmdata_categories does not exist (%s).', $request->getParameter('id')));
  46.    $jmdata_categories->delete();
  47.  
  48.    $this->redirect('categories/index');
  49.  }
  50.  
  51.  protected function processForm(sfWebRequest $request, sfForm $form)
  52.  {
  53.    $form->bind($request->getParameter($form->getName()));
  54.    if ($form->isValid())
  55.    {
  56.      $obj=$form->getObject();
  57.      var_dump($form);
  58.      if ($request->getParameter('categories') != 0) {
  59.        $parent_obj=JmdataCategoriesPeer::retrieveByPK($request->getParameter('categories'));
  60.        if ($request->getParameter('id')) {
  61.          $obj->moveToLastChildOf($parent_obj);
  62.          $jmdata_categories=$form->bindAndSave($values);
  63.        }
  64.        else {
  65.          $obj->setName($request->getParameter('name'));
  66.          $obj->setLink($request->getParameter('link'));
  67.          $obj->insertAsLastChildOf($parent_obj);
  68.          $jmdata_categories=$form->save();
  69.        }
  70.      }
  71.  
  72.    
  73.      $this->redirect('categories/index');
  74.    }
  75.  }
  76. }
  77. ?>


Jak usune z metoedy executeDelete $request->checkCSRFProtection(); to dziala dobrze ale chyba nie o to chodzi..

Czy moze ktos juz spotkal sie z tym problemem albo moze zna sposob aby rozwiazac ten problem?? Zaznaczam ze ochrona CSRF dziala dobrze w innych modulach wygenerowanych poprzez propel:build-form, natomiast dla tego jednego moduly nie dziala (model oparty na nestedset).
Dodam, ze gdy wyrzucany jest blad validatora "csrf token: Required" w kodzie strony ukryte pola id oraz csrf_token maja puste wartosci (metoda executeUpdate).
janek9
Sprobuj uzyc zamiast setWidgets... WidgetSchema['nazwa_pola'] = new itp..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.