Skip to content
Extraits de code Groupes Projets
Valider 25ede208 rédigé par cerdic's avatar cerdic Validation de marcimat
Parcourir les fichiers

fix: eviter un risque d'incoherence entre le nettoyage des variables dans le...

fix: eviter un risque d'incoherence entre le nettoyage des variables dans le contexte des cache et le nettoyage des urls self() utilisée par la pagination, notamment en cas de personalisation

Refs: securite#4848
parent 3fe97aaa
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -719,21 +719,41 @@ function nettoyer_uri($reset = null) {
* Nettoie une request_uri des paramètres var_xxx
*
* Attention, la regexp doit suivre _CONTEXTE_IGNORE_VARIABLES défini au début de public/assembler.php
* @uses _CONTEXTE_IGNORE_LISTE_VARIABLES
*
* @param string $request_uri
* @return string
*/
function nettoyer_uri_var($request_uri) {
static $preg_nettoyer;
if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
define('_CONTEXTE_IGNORE_LISTE_VARIABLES', ['^var_', '^PHPSESSID$', '^fbclid$', '^utm_']);
}
if (empty($preg_nettoyer)) {
$preg_nettoyer_vars = _CONTEXTE_IGNORE_LISTE_VARIABLES;
foreach ($preg_nettoyer_vars as &$var) {
if (str_starts_with($var, '^')) {
$var = substr($var, 1);
} else {
$var = '[^=&]*' . $var;
}
if (str_ends_with($var, '$')) {
$var = substr($var, 0, -1);
} else {
$var .= '[^=&]*';
}
}
$preg_nettoyer = ',([?&])(' . implode('|', $preg_nettoyer_vars) . ')=[^&]*(&|$),i';
}
if (empty($request_uri)) {
return $request_uri;
}
$uri1 = $request_uri;
do {
$uri = $uri1;
$uri1 = preg_replace(
',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
'\1',
$uri
);
$uri1 = preg_replace($preg_nettoyer, '\1', $uri);
} while ($uri <> $uri1);
return preg_replace(',[?&]$,', '', $uri1);
return rtrim($uri1, '?&');
}
......
......@@ -22,11 +22,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
// En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
}
function assembler($fond, string $connect = '') {
$chemin_cache = null;
......@@ -193,6 +188,9 @@ function assembler($fond, string $connect = '') {
/**
* Calcul le contexte de la page
*
* @uses _CONTEXTE_IGNORE_LISTE_VARIABLES
* @see nettoyer_uri_var()
*
* lors du calcul d'une page spip etablit le contexte a partir
* des variables $_GET et $_POST, purgees des fausses variables var_*
*
......@@ -203,15 +201,22 @@ function assembler($fond, string $connect = '') {
* @return array Un tableau du contexte de la page
*/
function calculer_contexte() {
static $preg_ignore_variables;
if (empty($preg_ignore_variables)) {
if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
nettoyer_uri_var('');
}
$preg_ignore_variables = '/(' . implode('|',_CONTEXTE_IGNORE_LISTE_VARIABLES) . ')/';
}
$contexte = [];
foreach ($_GET as $var => $val) {
if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
if (!preg_match($preg_ignore_variables, $var)) {
$contexte[$var] = $val;
}
}
foreach ($_POST as $var => $val) {
if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
if (!preg_match($preg_ignore_variables, $var)) {
$contexte[$var] = $val;
}
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter