From 5861bac1daa64e7e4361d796792e287e9bbc96f8 Mon Sep 17 00:00:00 2001 From: Jordan Diaz Date: Wed, 29 Jul 2026 11:48:05 +0000 Subject: [PATCH] fix(security): sanear idioma de URL para cerrar XSS reflejado El parametro ?idioma= llegaba crudo (la query string se reenvia entera a slug.php via .htaccess) y se reflejaba sin escapar en RUTA_RAIZ/ROOT, lang="..." y variables JS de las plantillas -> XSS reflejado explotable en cualquier web (p.ej. ?idioma=';alert(document.cookie);// en contexto JS). - variables.php: allowlist de idiomas antes de definir constantes/render; cualquier valor desconocido se descarta. - footer.tpl/header.tpl: json_encode en los sinks JS (defensa en profundidad). --- lib/variables.php | 8 ++++++++ template/layout_templates/footer.tpl | 2 +- template/layout_templates/header.tpl | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/variables.php b/lib/variables.php index 93f1a9c..cbc4959 100644 --- a/lib/variables.php +++ b/lib/variables.php @@ -61,6 +61,14 @@ if (substr($_SERVER["REQUEST_URI"],0,4)=="/ru/") $_REQUEST["idioma"]="ru"; if (substr($_SERVER["REQUEST_URI"],0,4)=="/ni/") $_REQUEST["idioma"]="ni"; + // Seguridad: el idioma puede llegar crudo por ?idioma= (la query string se + // reenvia entera a slug.php via .htaccess). Se refleja sin escapar en varias + // plantillas (RUTA_RAIZ/ROOT, lang="...", vars JS) -> XSS reflejado. Se valida + // contra un allowlist antes de definir constantes y renderizar: cualquier + // valor que no sea un idioma conocido se descarta. + $__idiomasValidos = array("en","es","de","fr","pt","se","cat","it","ko","ch","nu","ru","ni"); + if (!in_array(@$_REQUEST["idioma"], $__idiomasValidos, true)) $_REQUEST["idioma"] = ""; + if (@$_REQUEST["idioma"]) define("RUTA_RAIZ","/".$_REQUEST["idioma"]); else define("RUTA_RAIZ",""); if (@$_REQUEST["idioma"]) define("ROOT","/".$_REQUEST["idioma"]); else define("ROOT",""); diff --git a/template/layout_templates/footer.tpl b/template/layout_templates/footer.tpl index 7fb2c87..a1cfeae 100644 --- a/template/layout_templates/footer.tpl +++ b/template/layout_templates/footer.tpl @@ -35,7 +35,7 @@ if (!@$_REQUEST["viewAMP"]){ Resource::link('/css/cesta.css', true); ?>