Projet

Général

Profil

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é

Ajouté par Guillaume Fahrner il y a 2 mois. Mis à jour il y a 4 jours.

Statut:
En cours
Priorité:
Haut
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
10/12/2018
Echéance:
% réalisé:

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.

Historique

#1 Mis à jour par RastaPopoulos ♥ il y a 2 mois

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 Mis à jour par jluc - il y a 2 mois

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 Mis à jour par jluc - il y a 2 mois

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 Mis à jour par jluc - il y a 2 mois

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 Mis à jour par jluc - il y a 2 mois

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 Mis à jour par jluc - il y a environ un mois

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 Mis à jour par b b il y a 4 jours

  • Statut changé de Nouveau à En cours

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

Formats disponibles : Atom PDF