CSRF-атака Symfony обнаружена даже при прохождении _csrf_token - PullRequest
3 голосов
/ 10 августа 2011

Вот моя форма:

<form novalidate action="<?php echo url_for('article/submit') ?>" method="POST">
  <?php echo $form['title']->renderRow() ?>
  <?php echo $form['content']->renderRow() ?>
  <?php echo $form->renderHiddenFields() ?>
  <input type="submit" value="Save"/>
</form>

И, глядя на сгенерированный HTML-источник, _csrf_token IS фактически отображается.Вот мое действие:

public function executeSubmit(sfWebRequest $request)
{
  $this->forward404Unless($request->isMethod('post'));
  $request->checkCSRFProtection();

  die('submitting post...');
}

Ошибка:

_csrf_token [CSRF attack detected.]

Даже в моем действии, если я сделаю var_dump($_POST); die;, я получу:

Array
(
  [title] => string(8) "My title"
  [content] => string(10) "My Content"
  [_csrf_token] => string(32) "<my token here>"
)

Тактокен csrf определенно отображается и правильно передается.Что я делаю не так?

Кроме того, есть ли где-нибудь документация для checkCSRFProtection()?Документ API ничего не говорит об этом, кроме признания его существования.

1 Ответ

4 голосов
/ 10 августа 2011

Несколько вещей для проверки:

( Источник: От http://oldforum.symfony -project.org / index.php / t / 17867 / )

Убедитесь, что вы определили свой «секрет» в настройках:

csrf_secret: ThisIsMySecret  # Unique secret to enable CSRF protection or false to disable`

Кроме того, основываясь на том, что я получил из этого поста, проверка защиты CSRF выполняется автоматически в $this->form->isValid(), поэтому ваш вызов $request->checkCSRFProtection() не нужен, если вы уже проверяете, является ли форма действительной. Если нет, добавьте $this->form->isValid().

Может показаться, что $request->checkCSRFProtection() не работает с формами; его цель (если я прав) заключается в проверке запросов, когда пользователь нажимает на ссылку. Когда защита CSRF включена, link_to() автоматически добавляет защиту CSRF к ссылкам, которые она генерирует. Таким образом, в основном защита CSRF для формы отличается от защиты запроса, который не был получен из формы.

См. Этот билет для более подробной информации: http://trac.symfony -project.org / ticket / 7315

Другой интересный билет: http://trac.symfony -project.org / ticket / 5698

...