Protección CSRF en Moodle y Login Token

Un ataque CSRF (Cross Site Request Forgery) se aprovecha del acceso directo a la URL de los formularios de nuestra aplicación web y de las acciones que se pueden realizar con la sesión de usuario que tenemos abierta mientras visitamos otras webs.

Una de las maneras de prevenir este tipo de ataque es que la aplicación web utilice un token de sincronización en las acciones y formularios web susceptibles de ser atacados.

En Moodle la protección contra CSRF se empieza a implementar a partir de la versión 2.7.3 (consultar sus release notes para más detalle) y se va extendiendo a diferentes partes de Moodle en cada actualización major y minor.

Dos actualizaciones importantes a tener en cuenta son la 2.7.11 en que se ha añade esta protección al formulario de registro, y especialmente la versión 3.6 en que se añade protección contra CSRF en el formulario de login, además de un parámetro de configuración para activar o desactivar esta funcionalidad.

La protección en el formulario de login se implementa usando un Login Token. Si vas a crear un formulario de login a medida debes tenerlo en cuenta. En la propia documentación de Moodle se explica en detalle como hacerlo.

Esto también se aplica a partir de las versiones de mantenimiento 3.5.3, 3.4.6, 3.3.9 y 3.1.15 que se liberaron junto con la 3.6, añadiendo a todas ellas protección contra CSRF en el formulario de login.

Si estás trabajando con una versión de Moodle anterior a 2.7.11 o a cualquiera de las mencionadas y en ella tienes formularios de login creados a medida, y quieres actualizar a una versión superior de Moodle, debes de asegurarte también de añadir el Login Token en el template de estos formularios porque sino dejarán de funcionar ya que Moodle estará por defecto esperando validar un token anti CSRF que no encontrará.

En el config.php también tienes disponible el parámetro de configuración, añadido en las diferentes releases liberadas con la versión 3.6, para activar o desactivar esta funcionalidad … bajo tu responsabilidad!

// Disable login token validation for login pages. Login token validation is enabled
// by default unless $CFG->alternateloginurl is set.
//
// $CFG->disablelogintoken = true;