{"id":505,"date":"2020-11-16T23:29:52","date_gmt":"2020-11-16T23:29:52","guid":{"rendered":"https:\/\/danielribes.com\/blog\/?p=505"},"modified":"2026-04-06T11:50:20","modified_gmt":"2026-04-06T11:50:20","slug":"proteccion-csrf-en-moodle-y-login-token","status":"publish","type":"post","link":"https:\/\/danielribes.com\/blog\/proteccion-csrf-en-moodle-y-login-token\/","title":{"rendered":"Protecci\u00f3n CSRF en Moodle y Login Token"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Un ataque CSRF (<a rel=\"noreferrer noopener\" href=\"https:\/\/es.wikipedia.org\/wiki\/Cross-site_request_forgery\" target=\"_blank\">Cross Site Request Forgery<\/a>) se aprovecha del acceso directo a la URL de los formularios de nuestra aplicaci\u00f3n web y de las acciones que se pueden realizar con la sesi\u00f3n de usuario que tenemos abierta mientras visitamos otras webs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las maneras de prevenir este tipo de ataque es que la aplicaci\u00f3n web utilice un <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cross-site_request_forgery#Synchronizer_token_pattern\" target=\"_blank\">token de sincronizaci\u00f3n<\/a> en las acciones y formularios web susceptibles de ser atacados.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En Moodle la protecci\u00f3n contra CSRF se empieza a implementar a partir de la versi\u00f3n <strong>2.7.3<\/strong> (consultar sus <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.moodle.org\/dev\/Moodle_2.7.3_release_notes\" target=\"_blank\">release notes<\/a> para m\u00e1s detalle) y se va extendiendo a diferentes partes de Moodle en cada actualizaci\u00f3n <em>major<\/em> y <em>minor.<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Dos actualizaciones importantes a tener en cuenta son la <strong>2.7.11<\/strong> en que se ha a\u00f1ade esta protecci\u00f3n al formulario de registro, y especialmente la versi\u00f3n <strong>3.6<\/strong> en que se a\u00f1ade protecci\u00f3n contra CSRF en el formulario de login, adem\u00e1s de un par\u00e1metro de configuraci\u00f3n para activar o desactivar esta funcionalidad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La protecci\u00f3n en el formulario de login se implementa usando un <em>Login Token.<\/em> Si vas a crear un formulario de login a medida debes tenerlo en cuenta. En la <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.moodle.org\/dev\/Login_token\" target=\"_blank\">propia documentaci\u00f3n de Moodle<\/a> se explica en detalle como hacerlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto tambi\u00e9n se aplica a partir de las versiones de mantenimiento <strong>3.5.3, 3.4.6, 3.3.9<\/strong> y <strong>3.1.15<\/strong> que se liberaron junto con la <strong>3.6,<\/strong> a\u00f1adiendo a todas ellas protecci\u00f3n contra CSRF en el formulario de login.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si est\u00e1s trabajando con una versi\u00f3n de Moodle anterior a <strong>2.7.11<\/strong> o a cualquiera de las mencionadas y en ella tienes formularios de login creados a medida, y quieres actualizar a una versi\u00f3n superior de Moodle, debes de asegurarte tambi\u00e9n de a\u00f1adir el <em>Login Token<\/em> en el template de estos formularios porque sino dejar\u00e1n de funcionar ya que Moodle estar\u00e1 por defecto esperando validar un token anti CSRF que no encontrar\u00e1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el <em>config.php<\/em> tambi\u00e9n tienes disponible el par\u00e1metro de configuraci\u00f3n, a\u00f1adido en las diferentes releases liberadas con la versi\u00f3n 3.6, para activar o desactivar esta funcionalidad &#8230; <strong>bajo tu responsabilidad!<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Disable login token validation for login pages. Login token validation is enabled<br>\/\/ by default unless $CFG-&gt;alternateloginurl is set.<br>\/\/<br>\/\/ $CFG-&gt;disablelogintoken = true;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un ataque CSRF (Cross Site Request Forgery) se aprovecha del acceso directo a la URL de los formularios de nuestra aplicaci\u00f3n web y de las acciones que se pueden realizar con la sesi\u00f3n de usuario que tenemos abierta mientras visitamos otras webs. Una de las maneras de prevenir este tipo de ataque es que la [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[115],"tags":[47,97],"class_list":["post-505","post","type-post","status-publish","format-standard","hentry","category-desarrollo","tag-moodle","tag-seguridad"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"_links":{"self":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/comments?post=505"}],"version-history":[{"count":14,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/505\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/posts\/505\/revisions\/519"}],"wp:attachment":[{"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/media?parent=505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/categories?post=505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/danielribes.com\/blog\/wp-json\/wp\/v2\/tags?post=505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}