3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
14 if (!defined('_ECRIRE_INC_VERSION')) return;
17 * Composer le code d'execution d'un texte
18 * en principe juste un echappement de guillemets
19 * sauf si on veut aussi echapper et interdire les scripts serveurs
22 * @param string $texte
24 * @param string $arglist
28 function sandbox_composer_texte($texte, &$p){
29 $code = "'".str_replace(array("\\","'"),array("\\\\","\\'"), $texte)."'";
35 * Composer le code d'execution d'un filtre
39 * @param string $arglist
43 function sandbox_composer_filtre($fonc, $code, $arglist, &$p){
44 if (isset($GLOBALS['spip_matrice'][$fonc])) {
45 $code = "filtrer('$fonc',$code$arglist)";
48 // le filtre est defini sous forme de fonction ou de methode
49 // par ex. dans inc_texte, inc_filtres ou mes_fonctions
50 elseif ($f = chercher_filtre($fonc)) {
51 $code = "$f($code$arglist)";
53 // le filtre n'existe pas,
55 else erreur_squelette(array('zbug_erreur_filtre', array('filtre'=> texte_script($fonc))), $p);
60 // Calculer un <INCLURE(xx.php)>
61 // La constante ci-dessous donne le code general quand il s'agit d'un script.
62 define('CODE_INCLURE_SCRIPT', 'if (!($path = %s) OR !is_readable($path))
63 erreur_squelette(array("fichier_introuvable", array("fichier" => "%s")), array(%s));
65 $contexte_inclus = %s;
72 * Composer le code d'inclusion PHP
74 * @param string $fichier
76 * @param array $_contexte
79 function sandbox_composer_inclure_php($fichier, &$p, $_contexte){
80 $compil = texte_script(memoriser_contexte_compil($p));
81 // si inexistant, on essaiera a l'execution
82 if ($path = find_in_path($fichier))
84 else $path = "find_in_path(\"$fichier\")";
86 return sprintf(CODE_INCLURE_SCRIPT
, $path, $fichier, $compil, $_contexte);
90 * Composer le code se securisation anti script
96 function sandbox_composer_interdire_scripts($code, &$p){
98 if ($p->interdire_scripts
99 AND $p->etoile
!= '**') {
100 if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r))
101 $code = "interdire_scripts($code)";
103 $code = interdire_scripts($r[2]);
104 $code = "sinon(interdire_scripts($r[1]),'$code')";
112 * Appliquer des filtres sur un squelette complet
113 * la fonction peut plusieurs tableaux de filtres a partir du 3eme argument
114 * qui seront appliques dans l'ordre
117 * @param string $corps
118 * @param array $filtres
120 * @return mixed|string
122 function sandbox_filtrer_squelette($skel, $corps, $filtres){
123 $series_filtres = func_get_args();
124 array_shift($series_filtres);// skel
125 array_shift($series_filtres);// corps
127 // proteger les <INCLUDE> et tous les morceaux de php licites
128 if ($skel['process_ins'] == 'php')
129 $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS','echapper_php_callback', $corps);
131 // recuperer les couples de remplacement
132 $replace = echapper_php_callback();
134 foreach($series_filtres as $filtres){
136 foreach ($filtres as $filtre) {
137 if ($filtre AND $f = chercher_filtre($filtre))
142 // restaurer les echappements
143 return str_replace($replace[0],$replace[1],$corps);
147 // http://doc.spip.org/@echapper_php_callback
148 function echapper_php_callback($r=null) {
149 static $src = array();
150 static $dst = array();
152 // si on recoit un tableau, on est en mode echappement
153 // on enregistre le code a echapper dans dst, et le code echappe dans src
156 return $src[] = '___'.md5($r[0]).'___';
159 // si on recoit pas un tableau, on renvoit les couples de substitution
160 // et on RAZ les remplacements
161 $r = array($src,$dst);
162 $src = $dst = array();