symfony 1.4 как отключить защиту csrf для одной регистрационной формы? - PullRequest
3 голосов
/ 01 марта 2012

Я использую и sfDoctrineGuard, и sfForkedDoctrineApply.Я написал модуль, который позволяет вошедшему в систему пользователю создавать дочернего пользователя, который наследует некоторые из настроек профиля родителя.Он отлично работает, как написано, однако мне нужно отключить защиту csrf для всего приложения (в настройках), чтобы заставить его работать, потому что когда он включен, он (по праву, я мог бы добавить) обнаруживает csrfатака.Итак, мне нужен способ, чтобы отключить его, или, по крайней мере, поймать и удалить проверку.

Я перепробовал много техник, ни одна из которых не сработала.В том числе:

      $this->disableLocalCSRFProtection(); 

в форме.Проблема в том, что это пользовательская форма, и вызывается родительский конфиг, который внедряет защиту csrf.

Я прочитал несколько решений, которые, как мне кажется, указывают в правильном направлении: Symfony 1.4: пользовательское сообщение об ошибке для CSRF в формах , но они не решают эту конкретную проблему.

Предложения и решения приветствуются.Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 01 марта 2012

Базовый конструктор sfForm определяет, включено ли и что будет CSRFSecret.

class sfForm implements ArrayAccess, Iterator, Countable
{
  public function __construct($defaults = array(), $options = array(), $CSRFSecret = null)
  {
    $this->setDefaults($defaults);
    $this->options = $options;
    $this->localCSRFSecret = $CSRFSecret;

    $this->validatorSchema = new sfValidatorSchema();
    $this->widgetSchema    = new sfWidgetFormSchema();
    $this->errorSchema     = new sfValidatorErrorSchema($this->validatorSchema);

    $this->setup();
    $this->configure();

    $this->addCSRFProtection($this->localCSRFSecret);
    $this->resetFormFields();
  }
}

В тех случаях, когда отключение локальной защиты CSRF с помощью disableLocalCSRFProtection () не работает, вы можете попытаться создать экземпляр формы с "ложным" CSRFSecret ".

Пример:

$myForm = new myForm(array(), array(), false);

Редактировать: (Вышеуказанное предложение не сработало для автора)

Не могли бы вы попробовать, просто комментируя конфигурацию "csrf_secret" в файле settings.yml вашего приложения. Прокомментировав эту строку, не забудьте очистить кэш Symfony. Чтобы убедиться, что защита CSRF отключена глобально, вы можете проверить значение конфигурации "sf_csrf_secret" следующим образом:

var_dump(sfConfig::get('sf_csrf_secret'))

Это должно дать вам логическое значение false, которое подразумевает, что на самом деле вся защита CSRF отключена.

6 голосов
/ 08 апреля 2013

$ this-> disableLocalCSRFProtection (); у меня тоже не сработало. Я преуспел, установив для параметра crsf validator required значение false сразу после создания формы.

<?php
    $form = new UploadImageForm();
    $form->getValidator($form->getCSRFFieldName())->setOption('required', false);

    if ($request->isMethod(sfWebRequest::POST)) {
        ...
?>
...