Подтвердить что ты не робот

Symfony CSRF и Ajax

Я пытаюсь реализовать некоторые функции ajax в моем проекте Symfony 2. Используя jquery $.post, я хочу отправить некоторые данные обратно на мой контроллер. Однако, когда я просто POST данных нет защиты CSRF, поскольку защита symfony csrf, похоже, применима только к формам.

Что было бы довольно простым способом реализовать это?

При использовании форм я могу просто сделать $form- > isValid(), чтобы узнать, проходит ли токен CSRF. В настоящее время я размещаю все, что хочу POST, в форме, а затем размещаю это. Что в основном означает, что я использую только эту форму для реализации защиты CSRF, которая кажется хакерской.

4b9b3361

Ответ 1

В Symfony2 токен CSRF основан на сеансе по умолчанию. Если вы хотите сгенерировать его, вам просто нужно получить этот метод обслуживания и вызова:

//Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider by default
$csrf = $this->get('form.csrf_provider');
//Intention should be empty string, if you did not define it in parameters
$token = $csrf->generateCsrfToken($intention); 

return new Response($token);

Этот вопрос может быть вам полезен

Ответ 2

У меня была эта проблема, с перерывами. Оказалось, это произошло не из-за моего ajax, а из-за того, что Silex дает вам устаревший DefaultCsrfProvider, который сам использует идентификатор сеанса как часть токена, и я меняю идентификатор случайным образом для обеспечения безопасности. Вместо этого явное указание на использование нового CsrfTokenManager исправляет его, поскольку он генерирует токен и сохраняет его в сеансе, так что идентификатор сеанса может меняться без ущерба для действительности токена.

/** Use a CSRF provider that does not depend on the session ID being constant. We change the session ID randomly */
$app['form.csrf_provider'] = $app->share(function ($app) {
    $storage = new Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage($app['session']);
    return new Symfony\Component\Security\Csrf\CsrfTokenManager(null, $storage);
});

Ответ 3

Вы должны попробовать этот фрагмент. Форма Symfony должна генерировать специальный _csrf_token, который должен быть отправлен с почтовым запросом. Без этого значения будет поднято предупреждение безопасности.

Конечно, #targetForm должен быть заменен идентификатором формы и/конечной точкой целевым ajax url

$('#targetForm').bind('submit', function(e) {

    e.preventDefault();
    var data = $(this).serialize();

    $.post('/endpoint', data, function(data) {
        // some logic here
    });

});