From f4ee800c2ab7e54928abe81f7e994363bcd58f3d Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Tue, 11 Mar 2008 16:03:17 +0000 Subject: [PATCH] - desactiver la double occurence de interdire_script dans l'espace prive (appel general + appel dans les parties squeletisee) en inhibant les appels depuis squelette dans l'espace prive -> corrige un bug d'echappement du js des modeles dans l'espace prive - autoriser les modeles a produire du php, en l'echappant sur le meme modele que le js - application a un modele generique formulaire qui permet d'inserer les formulaires dynamiques implementes par la nouvelle API : <formulaire|ecrire_auteur> + deux test de typage sur les echappements pour eviter des warnings --- .gitattributes | 1 + dist/modeles/formulaire.html | 4 ++ ecrire/inc/filtres.php | 2 +- ecrire/inc/texte.php | 93 +++++++++++++++++++++--------------- ecrire/public/assembler.php | 5 +- 5 files changed, 64 insertions(+), 41 deletions(-) create mode 100644 dist/modeles/formulaire.html diff --git a/.gitattributes b/.gitattributes index d2bc1a4797..28658b1b89 100644 --- a/.gitattributes +++ b/.gitattributes @@ -261,6 +261,7 @@ dist/modeles/audio.html -text dist/modeles/doc.html -text dist/modeles/emb.html -text dist/modeles/foreach.html -text +dist/modeles/formulaire.html -text dist/modeles/image.html -text dist/modeles/img.html -text dist/modeles/lesauteurs.html -text diff --git a/dist/modeles/formulaire.html b/dist/modeles/formulaire.html new file mode 100644 index 0000000000..7536a4695c --- /dev/null +++ b/dist/modeles/formulaire.html @@ -0,0 +1,4 @@ +<?php +/* une fonction qui produit du php qui ne sera execute qu'au service final de la page */ +echo executer_balise_dynamique('FORMULAIRE_',array_merge(array('[(#ENV{class}|texte_script)]'),[(#ENV{args}|var_export{true})]),array(),'#ENV{lang}',0); +?> \ No newline at end of file diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index 24e6bdb0f4..ee39446df4 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -341,7 +341,7 @@ function proteger_amp($texte){ } // http://doc.spip.org/@entites_html function entites_html($texte, $tout=false) { - if (!$texte) return $texte; + if (!is_string($texte) OR !$texte) return $texte; include_spip('inc/texte'); $texte = htmlspecialchars(echappe_retour(echappe_html($texte,'',true),'','proteger_amp')); if ($tout) diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index e36ff5ef16..08eff917ae 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -222,7 +222,8 @@ function traiter_echap_script_dist($regs) { // http://doc.spip.org/@echappe_html function echappe_html($letexte, $source='', $no_transform=false, $preg='') { - if (!strlen($letexte)) return ''; + if (!is_string($letexte) or !strlen($letexte)) + return $letexte; if (!$preg) $preg = ',<(html|code|cadre|frame|script)' .'(\s[^>]*)?' @@ -302,11 +303,6 @@ function echappe_retour_modeles($letexte) if (!_DIR_RESTREINT) $letexte = interdire_scripts($letexte); - // Reinserer les echappements des modeles - - if (defined('_PROTEGE_JS_MODELES')) - $letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES); - return trim($letexte); } @@ -429,46 +425,65 @@ function echappe_js($t,$class='') { // http://doc.spip.org/@protege_js_modeles function protege_js_modeles($t) { if (isset($GLOBALS['visiteur_session'])){ - if (!defined('_PROTEGE_JS_MODELES')){ - include_spip('inc/acces'); - define('_PROTEGE_JS_MODELES',creer_uniqid()); - } - if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) + if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)){ + if (!defined('_PROTEGE_JS_MODELES')){ + include_spip('inc/acces'); + define('_PROTEGE_JS_MODELES',creer_uniqid()); + } foreach ($r as $regs) $t = str_replace($regs[0],code_echappement($regs[0],'javascript'._PROTEGE_JS_MODELES),$t); + } + if (preg_match_all(',<\?php.*?($|\?'.'>),isS', $t, $r, PREG_SET_ORDER)){ + if (!defined('_PROTEGE_PHP_MODELES')){ + include_spip('inc/acces'); + define('_PROTEGE_PHP_MODELES',creer_uniqid()); + } + foreach ($r as $regs) + $t = str_replace($regs[0],code_echappement($regs[0],'php'._PROTEGE_PHP_MODELES),$t); + } } return $t; } // Securite : empecher l'execution de code PHP, en le transformant en joli code +// l'espace prive est securise globalement par un appel explicite un interdire_script +// on desactive l'appel des squelettes tant que la protection globale est la +// a terme (tout l'espace prive en skel) il faudra mettre $protege_espace_prive = true // http://doc.spip.org/@interdire_scripts -function interdire_scripts($t) { - - // rien ? - if (!$t OR !strstr($t, '<')) return $t; - - // echapper les tags asp/php - $t = str_replace('<'.'%', '<%', $t); - - // echapper le php - $t = str_replace('<'.'?', '<?', $t); - - // echapper le < script language=php > - $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); - - // Pour le js, trois modes : parano (-1), prive (0), ok (1) - switch($GLOBALS['filtrer_javascript']) { - case 0: - if (!_DIR_RESTREINT) - $t = echappe_js($t,' style="color:red"'); - break; - case -1: - $t = echappe_js($t); - break; +function interdire_scripts($t, $protege_espace_prive = false) { + if (_DIR_RESTREINT || $protege_espace_prive) { + + // rien ? + if (!$t OR !strstr($t, '<')) return $t; + + // echapper les tags asp/php + $t = str_replace('<'.'%', '<%', $t); + + // echapper le php + $t = str_replace('<'.'?', '<?', $t); + + // echapper le < script language=php > + $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); + + // Pour le js, trois modes : parano (-1), prive (0), ok (1) + switch($GLOBALS['filtrer_javascript']) { + case 0: + if (!_DIR_RESTREINT) + $t = echappe_js($t,' style="color:red"'); + break; + case -1: + $t = echappe_js($t); + break; + } + + // pas de <base href /> svp ! + $t = preg_replace(',<(base\s),iS', '<\1', $t); } - - // pas de <base href /> svp ! - $t = preg_replace(',<(base\s),iS', '<\1', $t); + // Reinserer les echappements des modeles + if (defined('_PROTEGE_JS_MODELES')) + $t = echappe_retour($t,"javascript"._PROTEGE_JS_MODELES); + if (defined('_PROTEGE_PHP_MODELES')) + $t = echappe_retour($t,"php"._PROTEGE_PHP_MODELES); return $t; } @@ -523,8 +538,10 @@ function typo($letexte, $echapper=true, $connect='') { $letexte = echappe_retour($letexte, 'TYPO'); // Dans l'espace prive, securiser ici + // quand tout l'espace prive sera en skel, supprimer cette ligne et retablir + // $protege_espace_prive = true dans interdire_script if (!_DIR_RESTREINT) - $letexte = interdire_scripts($letexte); + $letexte = interdire_scripts($letexte,true); return $letexte; } diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index 31aadffc22..1578885787 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -715,8 +715,9 @@ function inclure_modele($type, $id, $params, $lien, $connect='') { // Traiter les parametres // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> - $contexte = array_merge($contexte, - creer_contexte_de_modele($params)); + $arg_list = creer_contexte_de_modele($params); + $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args + $contexte = array_merge($contexte,$arg_list); // On cree un marqueur de notes unique lie a ce modele // et on enregistre l'etat courant des globales de notes... -- GitLab