Por simplificar mucho: un ataque CSRF (Cross-site request forgery) consiste en hacer una petición a un sitio donde estás logueado sin que te enteres.
Imagina que tu aplicación tiene esta URL para borrar un producto a través de una petición POST:
misitio.com/producto/123/borrar
Por suerte esa URL solo funciona si estás logueado como usuario «admin». Así que nadie la puede usar para borrar productos de tu catálogo.
Pero ahora supongamos que alguien sabe que eres administrador de esa web y te engaña para que hagas click en un botón o sigas un enlace que realmente te lleve a esa URL (hay muchas formas de hacerlo).
Si cayeras en su engaño entonces ese producto se borraría sin que te enterases.
¿Y se puede evitar un ataque de este tipo?
Sí, se puede hacer usando un «token CSRF». Se trata de un token que añades a los formularios «peligrosos» de tu web y que va asociado a la sesión del usuario.
Cuando procesamos una petición como la del ejemplo de antes comprobamos si el token existe y es válido. Si no hay un token válido rechazamos la petición.
¿Tengo que proteger todas mis URL con tokens CSRF?
No, no es necesario. Debes hacerlo solo con las URL «peligrosas». Con URL «peligrosas me refiero a aquellas que tienen efectos, por ejemplo, borrando o modificando elementos de tu base de datos.