Mode recalcul: manque de contrôles ?
Hello,
Je me suis rendu compte que le paramètre var_mode=recalcul était pris en compte même quand on n'est pas connecté. Ce qui pourrait ouvrir la voie à des DDOS (bourriner sur des urls avec var_mode=recalcul).
En fouillant un peu le code de SPIP (branche 3.2 et 4.1), je vois qu'il n'y a effectivement pas de contrôle.
Je trouve aussi des inconsistences qui pourraient peut-être mener à des bugs (ne connaissant pas trop les entrailles de SPIP, je vous laisse juger de leur pertinence - ou non). Ce que je vais décrire plus loin est valable en 3.2.13 et sur la branche 4.1.
Par exemple, je vois qu'il y a une fonction init_var_mode: https://git.spip.net/spip/spip/src/branch/3.2/ecrire/inc/utils.php#L2857
Cette fonction rempli _VAR_MODE
en fonction du paramètre var_mode
, avec quelques contrôles, et en permettant éventuellement de fournir une liste de modes (il y a un explode
).
Toutefois, il y a des endroits dans le code où on teste le mode en faisant: _request('var_mode') === 'recalcul'
.
Par exemple: https://git.spip.net/spip/spip/src/branch/4.1/ecrire/inc/distant.php#L923
Ces endroits ne profitent donc pas de la possibilité de mixer plusieurs modes.
Dans un tout autre registre, je suis tombé sur cette ligne: https://git.spip.net/spip/spip/src/branch/4.1/ecrire/iterateur/data.php#L301
if (
$cache
and ($cache['time'] + ($ttl ?? $cache['ttl'])
> time())
and !(_request('var_mode') === 'recalcul'
and include_spip('inc/autoriser')
and autoriser('recalcul')
)
) {
On trouve ici un mystérieux test autoriser('recalcul')
que je ne vois nulle part ailleurs dans le code de SPIP. Pire, ce test m'a l'air d'être l'inverse de ce qu'on veut ! En effet, ici on teste «ne pas être en mode recalcul et avoir le droit de recalcul».