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
+