Symfony 2.4, el libro oficial

12.12. Protección CSRF

CSRF (acrónimo de Cross-site request forgery) es un método por el cual un usuario malintencionado intenta hacer que tus usuarios, sin saberlo, envíen datos que no quieren enviar. Afortunadamente, los ataques CSRF se pueden prevenir añadiendo un token CSRF a tus formularios.

La buena noticia es que por defecto Symfony añade y valida automáticamente los tokens CSRF. Esto significa que puedes aprovechar la protección CSRF sin que tengas que hacer nada. De hecho, todos los formularios de este capítulo han incluído protección CSRF sin que lo supieras!

La protección CSRF funciona añadiendo un campo oculto al formulario (por defecto el campo se llama _token) que contiene un valor que sólo tú y tu usuario conocéis. Esto garantiza que es el usuario verdadero el que está enviando los datos del formulario. Symfony valida automáticamente la presencia y la validez de este token.

El campo _token es un campo oculto y será incluído automáticamente en la plantilla si utilizas la función form_end(), que garantiza que se incluyen todos los campos definidos por el formulario.

El elemento CSRF se puede personalizar formulario por formulario. Por ejemplo:

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TaskType extends AbstractType
{
    // ...

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'      => 'Acme\TaskBundle\Entity\Task',
            'csrf_protection' => true,
            'csrf_field_name' => '_token',
            // una clave única para ayudar generar el token
            'intention'       => 'task_item',
        ));
    }

    // ...
}

Para desactivar la protección CSRF, establece la opción csrf_protection del formulario a false. También puedes personalizar el token CSRF para todos los formularios a nivel global.

Nota La opción intention es opcional pero mejora considerablemente la seguridad del token generado, produciendo uno diferente para cada formulario.