From 84d493135218c87cab8202d8497bb213493bbc65 Mon Sep 17 00:00:00 2001 From: "cedric@yterium.com" <> Date: Tue, 27 Apr 2010 16:55:30 +0000 Subject: [PATCH] securite : - deplacer le squelette de preview dans prive/ pour ne pas permettre sa consultation directe - ajouter un autoriser() dans l'action previsu pour fermer la porte lorsque le porte plume est desactive dans le public - dans tous les cas faire passer le resultat par safehtml car le texte source peut venir de n'importe qui/n'importe ou et peut servir de support a une attaque type XSS ou vol de cookie (l'utilisation d'un $_POST explicite exclue toutefois le simple lien) --- .gitattributes | 4 +-- action/porte_plume_previsu.php | 13 ++++++- inc/barre_outils.php | 34 ++++++++++++------- plugin.xml | 7 +++- porte_plume_pipelines.php | 18 ++++++++++ porte_plume_start.js.html | 5 +-- .../porte_plume_preview.html | 0 .../porte_plume_preview_fonctions.php | 0 8 files changed, 63 insertions(+), 18 deletions(-) rename porte_plume_preview.html => prive/porte_plume_preview.html (100%) rename porte_plume_preview_fonctions.php => prive/porte_plume_preview_fonctions.php (100%) diff --git a/.gitattributes b/.gitattributes index 5be0ae6..1f03c13 100644 --- a/.gitattributes +++ b/.gitattributes @@ -62,11 +62,11 @@ markitup/templates/preview.html -text /plugin.xml -text /porte_plume_options.php -text /porte_plume_pipelines.php -text -/porte_plume_preview.html -text -/porte_plume_preview_fonctions.php -text /porte_plume_start.js.html -text /porte_plume_start.js_fonctions.php -text prive/configurer/porte_plume.html -text +prive/porte_plume_preview.html -text +prive/porte_plume_preview_fonctions.php -text tests/all_tests.php -text tests/barre_outil_markitup.php -text tests/lanceur_spip.php -text diff --git a/action/porte_plume_previsu.php b/action/porte_plume_previsu.php index 2551dab..5b66dc2 100644 --- a/action/porte_plume_previsu.php +++ b/action/porte_plume_previsu.php @@ -13,6 +13,17 @@ if (!defined("_ECRIRE_INC_VERSION")) return; function action_porte_plume_previsu_dist(){ - echo recuperer_fond('porte_plume_preview',$_POST); + + // $_POST a ete sanitise par SPIP + // et le fond injecte des interdire_scripts pour empecher les injections PHP + // le js est bloque ou non selon les reglages de SPIP et si on est ou non dans l'espace prive + $contexte = $_POST; + + // mais il faut avoir le droit de previsualiser + // (par defaut le droit d'aller dans ecrire/) + if (!autoriser('previsualiser','porte_plume')) + $contexte = array(); + + echo recuperer_fond('prive/porte_plume_preview',$contexte); } ?> \ No newline at end of file diff --git a/inc/barre_outils.php b/inc/barre_outils.php index ea062ca..3c7061f 100644 --- a/inc/barre_outils.php +++ b/inc/barre_outils.php @@ -556,18 +556,28 @@ function barre_outils_liste(){ * @return string : texte traite */ function traitements_previsu($texte, $nom_champ='', $type_objet='', $connect=null) { + include_spip('public/interfaces'); // charger les traitements + safehtml($t); global $table_des_traitements; - if(!strlen($nom_champ) || !isset($table_des_traitements[$nom_champ])) - return propre($texte, $connect); - include_spip('base/abstract_sql'); - $table = table_objet($type_objet); - $ps = $table_des_traitements[$nom_champ]; - if(is_array($ps)) - $ps = $ps[(strlen($table) && isset($ps[$table])) ? $table : 0]; - if(!$ps) - return propre($texte, $connect); - // remplacer le placeholder %s par le texte fourni - eval('$texte=' . str_replace('%s', '$texte', $ps) . ';'); - return $texte; + if(!strlen($nom_champ) || !isset($table_des_traitements[$nom_champ])) { + $texte = propre($texte, $connect); + } + else { + include_spip('base/abstract_sql'); + $table = table_objet($type_objet); + $ps = $table_des_traitements[$nom_champ]; + if(is_array($ps)) + $ps = $ps[(strlen($table) && isset($ps[$table])) ? $table : 0]; + if(!$ps) + $texte = propre($texte, $connect); + else + // remplacer le placeholder %s par le texte fourni + eval('$texte=' . str_replace('%s', '$texte', $ps) . ';'); + } + // il faut toujours securiser le texte preivusalise car il peut contenir n'importe quoi + // et servir de support a une attaque xss ou vol de cookie admin + // on ne peut donc se fier au statut de l'auteur connecte car le contenu ne vient pas + // forcement de lui + return safehtml($texte); } ?> diff --git a/plugin.xml b/plugin.xml index 7c9d097..5b68600 100644 --- a/plugin.xml +++ b/plugin.xml @@ -2,7 +2,7 @@ [fr]Porte plume[en]Quill[ar]الريشة Matthieu Marcillaud GNU/GPL - 1.7.1 + 1.7.2 [fr]Une barre d'outil pour bien écrire _ Porte plume est une barre d'outil extensible pour SPIP qui @@ -29,6 +29,11 @@ _ الريشة هي شري porte_plume_options.php inc/barre_outils.php + + autoriser + porte_plume_pipelines.php + + insert_head insert_head_public diff --git a/porte_plume_pipelines.php b/porte_plume_pipelines.php index 5f5bea8..f46458c 100644 --- a/porte_plume_pipelines.php +++ b/porte_plume_pipelines.php @@ -6,6 +6,24 @@ */ #define('PORTE_PLUME_PUBLIC', true); +function porte_plume_autoriser($flux){return $flux;} + +/** + * Autoriser l'action de previsu : la fermer aux non identifies + * si pas de porte plume dans le public + * @param string $faire + * @param string $type + * @param int $id + * @param array $qui + * @param array $opt + * @return bool + */ +function autoriser_porte_plume_previsualiser_dist($faire, $type, $id, $qui, $opt){ + return + (test_espace_prive() AND autoriser('ecrire')) + OR (!test_espace_prive() AND autoriser('afficher_public','porte_plume')); +} + // autoriser le porte plume dans le public ? function autoriser_porte_plume_afficher_public_dist($faire, $type, $id, $qui, $opt) { // compatibilite d'avant le formulaire de configuration diff --git a/porte_plume_start.js.html b/porte_plume_start.js.html index 4be97fb..c596707 100644 --- a/porte_plume_start.js.html +++ b/porte_plume_start.js.html @@ -1,7 +1,8 @@ #CACHE{7*24*3600} #HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET} -[(#REM) chargement des definitions des barres d'outils ] +[(#REM) chargement des definitions des barres d'outils +