getParameters(); if (isset($refs[0]) and $refs[0]->name == 'Pile') { $code = "$f(\$Pile,$code$arglist)"; } else { $code = "$f($code$arglist)"; } } // le filtre n'existe pas, // on le notifie else { erreur_squelette(array('zbug_erreur_filtre', array('filtre' => texte_script($fonc))), $p); } return $code; } // Calculer un // La constante ci-dessous donne le code general quand il s'agit d'un script. define('CODE_INCLURE_SCRIPT', 'if (!($path = %s) OR !is_readable($path)) erreur_squelette(array("fichier_introuvable", array("fichier" => "%s")), array(%s)); else { $contexte_inclus = %s; include $path; } ' ); /** * Composer le code d'inclusion PHP * * @param string $fichier * @param Champ $p * Balise créant l'inclusion * @param array $_contexte * @return string */ function sandbox_composer_inclure_php($fichier, &$p, $_contexte) { $compil = texte_script(memoriser_contexte_compil($p)); // si inexistant, on essaiera a l'execution if ($path = find_in_path($fichier)) { $path = "\"$path\""; } else { $path = "find_in_path(\"$fichier\")"; } return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte); } /** * Composer le code de sécurisation anti script * * @param string $code * @param Champ $p * Balise sur laquelle s'applique le filtre * @return string */ function sandbox_composer_interdire_scripts($code, &$p) { // Securite if ($p->interdire_scripts and $p->etoile != '**' ) { if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) { $code = "interdire_scripts($code)"; } else { $code = interdire_scripts($r[2]); $code = "sinon(interdire_scripts($r[1]),'$code')"; } } return $code; } /** * Appliquer des filtres sur un squelette complet * * La fonction accèpte plusieurs tableaux de filtres à partir du 3ème argument * qui seront appliqués dans l'ordre * * @uses echapper_php_callback() * * @param array $skel * @param string $corps * @param array $filtres * Tableau de filtres à appliquer. * @return mixed|string */ function sandbox_filtrer_squelette($skel, $corps, $filtres) { $series_filtres = func_get_args(); array_shift($series_filtres);// skel array_shift($series_filtres);// corps // proteger les et tous les morceaux de php licites if ($skel['process_ins'] == 'php') { $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps); } // recuperer les couples de remplacement $replace = echapper_php_callback(); foreach ($series_filtres as $filtres) { if (count($filtres)) { foreach ($filtres as $filtre) { if ($filtre and $f = chercher_filtre($filtre)) { $corps = $f($corps); } } } } // restaurer les echappements return str_replace($replace[0], $replace[1], $corps); } /** * Callback pour échapper du code PHP (les séquences ``) * * Rappeler la fonction sans paramètre pour obtenir les substitutions réalisées. * * @see sandbox_filtrer_squelette() * * @param array|null $r * - array : ce sont les captures de la regex à échapper * - NULL : demande à dépiler tous les échappements réalisés * @return string|array * - string : hash de substitution du code php lorsque `$r` est un array * - array : Liste( liste des codes PHP, liste des substitutions ) **/ function echapper_php_callback($r = null) { static $src = array(); static $dst = array(); // si on recoit un tableau, on est en mode echappement // on enregistre le code a echapper dans dst, et le code echappe dans src if (is_array($r)) { $dst[] = $r[0]; return $src[] = '___' . md5($r[0]) . '___'; } // si on recoit pas un tableau, on renvoit les couples de substitution // et on RAZ les remplacements $r = array($src, $dst); $src = $dst = array(); return $r; }