$return .= "<$mode class=\"base64$source\" title=\"$base64\"></$mode>";
}
- return $return
- . ((!$no_transform AND $mode == 'div')
- ? "\n\n"
- : ''
- );
-;
+ return $return;
+
}
return $regs[0];
}
+/**
+ * Traiter les blocs <math></math> echappes par echappe_html
+ * @param $regs
+ * @return string
+ */
+function traiter_echap_math_dist($regs) {
+ // Gestion du TeX
+ if (!function_exists('traiter_math'))
+ include_spip('inc/math');
+
+ $t = traiter_math($regs[0], '');
+ return $t;
+}
+
define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
// - pour $source voir commentaire infra (echappe_retour)
}
if (($preg OR strpos($letexte,"<")!==false)
- AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER))
+ AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)) {
foreach ($matches as $regs) {
// echappements tels quels ?
if ($no_transform) {
$p = strpos($letexte,$regs[0]);
$letexte = substr_replace($letexte,code_echappement($echap, $source, $no_transform),$p,strlen($regs[0]));
}
+ }
if ($no_transform)
return $letexte;
// Gestion du TeX
- if (strpos($letexte, "<math>") !== false) {
- include_spip('inc/math');
- $letexte = traiter_math($letexte, $source);
+ // code mort sauf si on a personalise _PROTEGE_BLOCS sans y mettre <math>
+ // eviter la rupture de compat en branche 3.0
+ // a supprimer en branche 3.1
+ if (strpos($preg ? $preg : _PROTEGE_BLOCS,'code')!==false){
+ if (strpos($letexte, "<math>") !== false) {
+ include_spip('inc/math');
+ $letexte = traiter_math($letexte, $source);
+ }
}
// Echapper le php pour faire joli (ici, c'est pas pour la securite)
- if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
- $letexte, $matches, PREG_SET_ORDER))
- foreach ($matches as $regs) {
- $letexte = str_replace($regs[0],
- code_echappement(highlight_string($regs[0],true), $source),
- $letexte);
+ // seulement si on a echappe les <script>
+ // (derogatoire car on ne peut pas faire passer < ? ... ? >
+ // dans une callback autonommee
+ if (strpos($preg ? $preg : _PROTEGE_BLOCS,'script')!==false){
+ if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
+ $letexte, $matches, PREG_SET_ORDER))
+ foreach ($matches as $regs) {
+ $letexte = str_replace($regs[0],
+ code_echappement(highlight_string($regs[0],true), $source),
+ $letexte);
+ }
}
return $letexte;
$letexte = "";
while (count($textMatches)) {
// un texte a echapper
- $letexte .= str_replace(array("<"),array('<'),array_shift($textMatches));
+ $letexte .= str_replace("<",'<',array_shift($textMatches));
// un tag html qui a servit a faite le split
$letexte .= array_shift($textMatches);
}
return $letexte;
}
-// Securite : utiliser SafeHTML s'il est present dans ecrire/safehtml/
-// http://doc.spip.org/@safehtml
+/**
+ * Si le html contenu dans un texte ne passe pas sans transformation a travers safehtml
+ * on l'echappe
+ * si safehtml ne renvoie pas la meme chose on echappe les < en < pour montrer le contenu brut
+ *
+ * @param string $texte
+ * @return string
+ */
+function echapper_html_suspect($texte){
+ if (strpos($texte,'<')===false OR strpos($texte,'=')===false)
+ return $texte;
+
+ // on teste sur strlen car safehtml supprime le contenu dangereux
+ // mais il peut aussi changer des ' en " sur les attributs html,
+ // donc un test d'egalite est trop strict
+ if (strlen(safehtml($texte))!==strlen($texte)){
+ $texte = str_replace("<","<",$texte);
+ }
+
+ return $texte;
+}
+
+
+/**
+ * Sécurise un texte HTML
+ *
+ * Échappe le code PHP et JS.
+ * Applique en plus safehtml si un plugin le définit dans inc/safehtml.php
+ *
+ * Permet de protéger les textes issus d'une origine douteuse (forums, syndications...)
+ *
+ * @filtre
+ * @link http://www.spip.net/4310
+ *
+ * @param string $t
+ * Texte à sécuriser
+ * @return string
+ * Texte sécurisé
+**/
function safehtml($t) {
static $safehtml;