Symfony CSRF y Ajax
(3)
Estoy tratando de implementar algunas funcionalidades ajax en mi proyecto Symfony 2. Usando $ .post de jquery, quiero enviar algunos datos a mi controlador. Sin embargo, cuando acabo de PUBLICAR los datos, no existe protección CSRF, ya que la protección csrf de Symfony solo parece aplicarse a los formularios.
¿Cuál sería una forma bastante directa de implementar esto?
Cuando uso formularios, puedo hacer $ form-> isValid () para averiguar si el token CSRF pasa o no. Actualmente estoy colocando todo lo que quiero POSTAR en un formulario y luego publicando eso. Lo que básicamente significa que solo estoy usando esa forma para implementar la protección de CSRF, lo cual parece hacky.
Deberías probar este fragmento. El formulario Symfony debe generar _csrf_token especial que se debe enviar con solicitud posterior. Sin este valor, se generará una alerta de seguridad.
Por supuesto, #targetForm debe reemplazarse por id de formulario y / endpoint por URL de ajax de destino
$(''#targetForm'').bind(''submit'', function(e) {
e.preventDefault();
var data = $(this).serialize();
$.post(''/endpoint'', data, function(data) {
// some logic here
});
});
En Symfony2 CSRF token se basa en la sesión de forma predeterminada. Si quieres generarlo, solo tienes que obtener este servicio y llamar al método de generación:
//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);
Esta pregunta puede ser útil para ti
Tuve este problema, intermitentemente. Resultó que no se debió a mi ajax, sino porque Silex te da un DefaultCsrfProvider
obsoleto que usa la propia ID de sesión como parte del token, y cambio la ID aleatoriamente para mayor seguridad. En cambio, explícitamente le indica que use el nuevo CsrfTokenManager
corrige, ya que ese genera un token y lo almacena en la sesión, de modo que el ID de sesión puede cambiar sin afectar la validez del token.
/** 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);
});