Project

General

Profile

Anomalie #4242

[BUG : aucun moyen de définir les constantes utilisé dans l'écran de sécurité] : mes_options est inclus après l'écran de sécurité

Added by Guillaume Fahrner 11 months ago. Updated 4 months ago.

Status:
En cours
Priority:
Haut
Assignee:
-
Category:
-
Target version:
-
Start date:
12/10/2018
Due date:
% Done:

0%

Resolution:
Navigateur:

Description

Tout est dans le titre. Cela rend notamment inopérant les constantes comme "_ECRAN_SECURITE_LOAD". On peut bien sur écraser les valeurs en durs mais il faut le faire à chaque MAJ.

History

#1 Updated by RastaPopoulos ♥ 11 months ago

Ouais +1, j'avais déjà signalé ce problème exactement pareil, à propos de cette constante qui gère le load max, et ça nous avait bien cassé la tête pour pouvoir la personnaliser de manière pérenne, sans que ce soit écrasé à chaque fois qu'on met à jour. Ya un truc qui va pas dans cette conception…

#2 Updated by jluc - 10 months ago

De mémoire : l'écran a été conçu pour être installé par un hébergeur de manière indépendante des sites SPIP hébergés, via un apache prepend.

On trouve des traces de cet objectif dans la doc où on voit que la problèmatique "hébergeur" est très importante : « un hébergeur (snip) ne souhaite pas laisser de trou sur un de ses sites hébergés ... Cet écran peut être activé au niveau du serveur sur l’ensemble des scripts php (SPIP ou pas), et garantit, s’il est à jour, que toutes les failles connues de quelque version de SPIP que ce soit sont impossibles à exploiter. »

Dans cette configuration "prepend apache", l'écran est indépendant des sites SPIP et il ne peux accéder aux fichiers de configs.

Aprés, ça n'empêche pas de lui demander d'y accéder s'il y en a un. Mais je me demande s'il faut lui faire accéder à tout le mes_options qui peut être trés important et lourd ... et qui peut être aussi ciblé par des failles que l'écran est sensé corriger.

Si fichier de configuration il y a, il me semble donc que ce devrait être un fichier d'option léger et dédié à l'écran seulement, voir un fichier d' .ini non exécutable.

#3 Updated by jluc - 10 months ago

Ceci dit ce serait bien de pouvoir étendre les protections aussi. Par exemple là un site ciblé , il y avait plein d'arguments d'url 'page' invalides dans les requêtes, que l'écran n'écarte pas :
- page=articles%29%20UNION%20ALL%20SELECT%20NULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL%2CNULL
- page=articles%' AND 7327=7327 AND '%'='
- page=%';SELECT DBMS_PIPE.RECEIVE_MESSAGE(CHR||CHR||CHR||CHR,5) FROM DUAL--

etc

Il n'y a pas de protection sur la valeur de 'page' et je pourrais vouloir en ajouter une.
Donc pas seulement paramétrer les constantes.

#4 Updated by jluc - 10 months ago

Et en plus, l'écran se limite afin de ne pas géner drupal et autres softs pouvant tourner sur le serveur...

Une extension de l'écran serait donc bienvenue afin de gérer des filtrages spécifiques à SPIP :
- tout ce qui concerne SPIP et qui n'a pas pu être inclu car ça gêne si on l'applique à l'échelle d'un serveur
- les réglages propres à un site SPIP particulier

Ce ecran_securite_options.php serait un peu comme le htaccess livré avec SPIP : une base SPIP et des personnalisations par site

Du coup voilà ce que j'ai fait :

Dans ecran_securite.php, ligne 56 aprés la fermeture du if (!defined('_IS_BOT_FRIEND')){...} ) :

global $ecran_securite_raison;
if (file_exists('config/ecran_securite_options.php'))
    include ('config/ecran_securite_options.php');

Dans l'ecran_securite_options.php d'un site particulier :

global $ecran_securite_raison;

//
// Filtrages inapplicables par prepend apache à l'échelle d'un serveur
// mais valables pour tous les SPIP
//
if (isset ($_REQUEST['page'])
and preg_match('/\W/', $_REQUEST['page']))
$ecran_securite_raison = 'page';

//
// Filtrages pour un site SPIP particulier
// Ajoutez ici les filtrages pour votre site particulier
//

if ((isset($_GET['geo_departement'])
        and strlen ($_GET['geo_departement'])>3)
    or (isset($_POST['geo_departement'])
        and strlen ($_POST['geo_departement'])>3)
    or (isset($GLOBALS['geo_departement'])
        and strlen ($GLOBALS['geo_departement'])>3)) 
    $ecran_securite_raison = 'geo_departement';

#5 Updated by jluc - 10 months ago

je répète pour l'ecran_securite_options.php d'un site particulier :

global $ecran_securite_raison;

//
// Filtrages inapplicables par prepend apache à l'échelle d'un serveur
// mais valables pour tous les SPIP
//
if (isset ($_REQUEST['page'])
and preg_match('/\W/', $_REQUEST['page']))
$ecran_securite_raison = 'page';

//
// Filtrages pour un site SPIP particulier
// Ajoutez ici les filtrages pour votre site particulier
//
if ((isset($_GET['geo_departement'])
        and strlen ($_GET['geo_departement'])>3)
    or (isset($_POST['geo_departement'])
        and strlen ($_POST['geo_departement'])>3)
    or (isset($GLOBALS['geo_departement'])
        and strlen ($GLOBALS['geo_departement'])>3)) 
    $ecran_securite_raison = 'geo_departement';

#6 Updated by jluc - 10 months ago

Dans spip_loader, ce fichier d'option a été créé et s'appelle spip_loader_config.php cf https://www.spip.net/spip-dev/INSTALL/spip_loader.php
Les fichiers d'option de spip_loader et de l'écran devraient un fichier d'option avec le même suffixe (donc _config pour suivre spip_loader...).

#7 Updated by b b 8 months ago

  • Status changed from Nouveau to En cours

Bonne idée que de faire comme dans le loader avec un fichier ecran_securite_config.php optionnel :)

#8 Updated by RastaPopoulos ♥ 4 months ago

+1 aussi pour le config à inclure si présent comme le loader

Toute personnalisation doit toujours se faire dans un fichier séparé, jamais en modifiant une librairie directement.

Also available in: Atom PDF