function safehtml($t) { static $safehtml; if (!$t or !is_string($t)) { return $t; } # attention safehtml nettoie deux ou trois caracteres de plus. A voir if (strpos($t, '<') === false) { return str_replace("", '', $t); } $t = interdire_scripts($t); // jolifier le php $t = echappe_js($t); if (!isset($safehtml)) { $safehtml = charger_fonction('safehtml', 'inc', true); } if ($safehtml) { $t = $safehtml($t); } return interdire_scripts($t); // interdire le php (2 precautions) }
/** * Empêcher l'exécution de code PHP et JS * * Sécurité : empêcher l'exécution de code PHP, en le transformant en joli code * dans l'espace privé. Cette fonction est aussi appelée par propre et typo. * * De la même manière, la fonction empêche l'exécution de JS mais selon le mode * de protection déclaré par la globale filtrer_javascript : * - -1 : protection dans l'espace privé et public * - 0 : protection dans l'espace public * - 1 : aucune protection * * Il ne faut pas désactiver globalement la fonction dans l'espace privé car elle protège * aussi les balises des squelettes qui ne passent pas forcement par propre ou typo après * si elles sont appelées en direct * * @param string $arg * Code à protéger * @return string * Code protégé **/ function interdire_scripts($arg) { // on memorise le resultat sur les arguments non triviaux static $dejavu = array(); // Attention, si ce n'est pas une chaine, laisser intact if (!$arg or !is_string($arg) or !strstr($arg, '<')) { return $arg; } if (isset($dejavu[$GLOBALS['filtrer_javascript']][$arg])) { return $dejavu[$GLOBALS['filtrer_javascript']][$arg]; } // echapper les tags asp/php $t = str_replace('<' . '%', '<%', $arg); // 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); } break; case -1: $t = echappe_js($t); break; } // pas de <base href /> svp ! $t = preg_replace(',<(base\\b),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 $dejavu[$GLOBALS['filtrer_javascript']][$arg] = $t; }
function safehtml($t) { static $safehtml; # attention safehtml nettoie deux ou trois caracteres de plus. A voir if (strpos($t,'<')===false) return str_replace("\x00", '', $t); $t = interdire_scripts($t); // jolifier le php $t = echappe_js($t); if (!isset($safehtml)) $safehtml = charger_fonction('safehtml', 'inc', true); if ($safehtml) $t = $safehtml($t); return interdire_scripts($t); // interdire le php (2 precautions) }