function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') { include_spip('inc/texte'); if ($type == "rubrique") { $row = sql_fetsel("titre, descriptif", "spip_rubriques", "id_rubrique = {$id}"); if ($row) { $titre = typo($row["titre"]); $descriptif = propre($row["descriptif"]); } else { $titre = _T('info_racine_site'); } } else { $titre = ''; } $res = ''; if ($type == "rubrique" and $GLOBALS['spip_display'] != 1 and isset($GLOBALS['meta']['image_process'])) { if ($GLOBALS['meta']['image_process'] != "non") { $chercher_logo = charger_fonction('chercher_logo', 'inc'); if ($res = $chercher_logo($id, 'id_rubrique', 'on')) { list($fid, $dir, $nom, $format) = $res; include_spip('inc/filtres_images_mini'); $res = image_reduire("<img src='{$fid}' alt='' />", 100, 48); if ($res) { $res = "<div style='float: " . $GLOBALS['spip_lang_right'] . "; margin-" . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>{$res}</div>"; } } } } $rac = spip_htmlentities($rac); # ce lien provoque la selection (directe) de la rubrique cliquee # et l'affichage de son titre dans le bandeau $titre = strtr(str_replace("'", "’", str_replace('"', """, textebrut($titre))), "\n\r", " "); $js_func = $do . '_selection_titre'; return "<div style='display: none;'>" . "<input type='text' id='" . $rac . "_sel' value='{$id}' />" . "<input type='text' id='" . $rac . "_sel2' value=\"" . entites_html($titre) . "\" />" . "</div>" . "<div class='informer' style='padding: 5px; border-top: 0px;'>" . (!$res ? '' : $res) . "<p><b>" . safehtml($titre) . "</b></p>" . (!$descriptif ? '' : "<div>" . safehtml($descriptif) . "</div>") . "<div style='text-align: " . $GLOBALS['spip_lang_right'] . ";'>" . "<input type='submit' class='fondo' value='" . _T('bouton_choisir') . "'\nonclick=\"{$js_func}('{$titre}',{$id},'selection_rubrique','id_parent'); return false;\" />" . "</div>" . "</div>"; }
function formulaires_login_charger_dist($cible = "", $login = "", $prive = null) { $erreur = _request('var_erreur'); if (!$login) { $login = strval(_request('var_login')); } // si on est deja identifie if (!$login and isset($GLOBALS['visiteur_session']['login'])) { $login = $GLOBALS['visiteur_session']['login']; } // ou si on a un cookie admin if (!$login) { if (isset($_COOKIE['spip_admin']) and preg_match(",^@(.*)\$,", $_COOKIE['spip_admin'], $regs)) { $login = $regs[1]; } } include_spip('inc/auth'); $row = auth_informer_login($login); // Construire l'environnement du squelette // Ne pas proposer de "rester connecte quelques jours" // si la duree de l'alea est inferieure a 12 h (valeur par defaut) $valeurs = array('var_login' => $login, 'editable' => !$row, 'cnx' => isset($row['cnx']) ? $row['cnx'] : '', 'auth_http' => login_auth_http(), 'rester_connecte' => _RENOUVELLE_ALEA < 12 * 3600 ? '' : ' ', '_logo' => isset($row['logo']) ? $row['logo'] : '', '_alea_actuel' => isset($row['alea_actuel']) ? $row['alea_actuel'] : '', '_alea_futur' => isset($row['alea_futur']) ? $row['alea_futur'] : '', '_pipeline' => 'affiche_formulaire_login'); if ($erreur or !isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) { $valeurs['editable'] = true; } if (is_null($prive) ? is_url_prive($cible) : $prive) { include_spip('inc/autoriser'); $loge = autoriser('ecrire'); } else { $loge = (isset($GLOBALS['visiteur_session']['auth']) and $GLOBALS['visiteur_session']['auth'] != ''); } // Si on est connecte, appeler traiter() // et lancer la redirection si besoin if (!$valeurs['editable'] and $loge) { $traiter = charger_fonction('traiter', 'formulaires/login'); $res = $traiter($cible, $login, $prive); $valeurs = array_merge($valeurs, $res); if (isset($res['redirect']) and $res['redirect']) { include_spip('inc/headers'); # preparer un lien pour quand redirige_formulaire ne fonctionne pas $valeurs['_deja_loge'] = inserer_attribut("<a>" . _T('login_par_ici') . "</a>{$m}", 'href', $res['redirect']); $m = redirige_formulaire($res['redirect']); } } // en cas d'echec de cookie, inc_auth a renvoye vers le script de // pose de cookie ; s'il n'est pas la, c'est echec cookie // s'il est la, c'est probablement un bookmark sur bonjour=oui, // et pas un echec cookie. if ($erreur == 'cookie') { $valeurs['echec_cookie'] = ' '; } elseif ($erreur) { // une erreur d'un SSO indique dans la redirection vers ici // mais il faut se proteger de toute tentative d'injection malveilante include_spip('inc/texte'); $valeurs['message_erreur'] = safehtml($erreur); } return $valeurs; }
/** * enlever les scripts de html si necessaire * on utilise safehtml * * @param string $file * @return array */ function medata_html_dist($file) { $meta = array(); // Securite si pas autorise : virer les scripts et les references externes // sauf si on est en mode javascript 'ok' (1), cf. inc_version if ($GLOBALS['filtrer_javascript'] < 1 and !autoriser('televerser', 'script')) { $texte = spip_file_get_contents($file); include_spip('inc/texte'); $new = trim(safehtml($texte)); // petit bug safehtml if ($new != $texte) { ecrire_fichier($file, $new); } } return $meta; }
/** * Déterminer les dimensions d'un svg, et enlever ses scripts si nécessaire * * On utilise safehtml qui n'est pas apropriée pour ça en attendant mieux * cf http://www.slideshare.net/x00mario/the-image-that-called-me * http://heideri.ch/svgpurifier/SVGPurifier/index.php * * @param string $file * @return array Tableau (largeur, hauteur) */ function metadata_svg_dist($file) { $meta = array(); $texte = spip_file_get_contents($file); // Securite si pas autorise : virer les scripts et les references externes // sauf si on est en mode javascript 'ok' (1), cf. inc_version if ($GLOBALS['filtrer_javascript'] < 1 and !autoriser('televerser', 'script')) { include_spip('inc/texte'); $new = trim(safehtml($texte)); // petit bug safehtml if (substr($new, 0, 2) == ']>') { $new = ltrim(substr($new, 2)); } if ($new != $texte) { ecrire_fichier($file, $texte = $new); } } $width = $height = 150; if (preg_match(',<svg[^>]+>,', $texte, $s)) { $s = $s[0]; if (preg_match(',\\WviewBox\\s*=\\s*.\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+),i', $s, $r)) { $width = $r[3]; $height = $r[4]; } else { // si la taille est en centimetre, estimer le pixel a 1/64 de cm if (preg_match(',\\Wwidth\\s*=\\s*.(\\d+)([^"\']*),i', $s, $r)) { if ($r[2] != '%') { $width = $r[1]; if ($r[2] == 'cm') { $width <<= 6; } } } if (preg_match(',\\Wheight\\s*=\\s*.(\\d+)([^"\']*),i', $s, $r)) { if ($r[2] != '%') { $height = $r[1]; if ($r[2] == 'cm') { $height <<= 6; } } } } } $meta['largeur'] = $width; $meta['hauteur'] = $height; return $meta; }
function BOUCLE_art_syndichtml_bb1fa8f06f75cd5c61b4de0a063c1a54(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) { static $command = array(); static $connect; $command['connect'] = $connect = ''; if (!isset($command['table'])) { $command['table'] = 'syndic_articles'; $command['id'] = '_art_syndic'; $command['from'] = array('syndic_articles' => 'spip_syndic_articles', 'L1' => 'spip_syndic'); $command['type'] = array(); $command['groupby'] = array(); $command['select'] = array("syndic_articles.date", "syndic_articles.titre", "syndic_articles.url", "L1.url_site", "L1.nom_site", "syndic_articles.descriptif"); $command['orderby'] = array('syndic_articles.date DESC'); $command['join'] = array('L1' => array('syndic_articles', 'id_syndic')); $command['limit'] = '0,5'; $command['having'] = array(); } $command['where'] = array(quete_condition_statut('L1.statut', 'publie,prop', 'publie', ''), quete_condition_statut('syndic_articles.statut', 'publie,prop', 'publie', ''), array('=', 'L1.id_rubrique', sql_quote(@$Pile[0]['id_rubrique'], '', 'bigint(21) NOT NULL DEFAULT \'0\''))); if (defined("_BOUCLE_PROFILER")) { $timer = time() + microtime(); } $t0 = ""; // REQUETE $iter = IterFactory::create("SQL", $command, array('squelettes/inc/inc-syndic.html', 'html_bb1fa8f06f75cd5c61b4de0a063c1a54', '_art_syndic', 6, $GLOBALS['spip_lang'])); if (!$iter->err()) { $l1 = _T('public|spip|ecrire:form_prop_nom_site'); $SP++; // RESULTATS while ($Pile[$SP] = $iter->fetch()) { $t0 .= ' <li>' . (($t1 = strval(interdire_scripts(affdate(normaliser_date($Pile[$SP]['date']))))) !== '' ? '<span>' . $t1 . '</span>' : '') . ' ' . (($t1 = strval(interdire_scripts(supprimer_numero($Pile[$SP]['titre'])))) !== '' ? '<a href="' . vider_url($Pile[$SP]['url']) . '" ' . (($t2 = strval(interdire_scripts(attribut_html(supprimer_tags(typo(supprimer_numero(calculer_url($Pile[$SP]['url_site'], $Pile[$SP]['nom_site'], 'titre', $connect, false)), "TYPO", $connect, $Pile[0])))))) !== '' ? 'title="' . $l1 . ' : ' . $t2 . '"' : '') . ' class="spip_out">' . $t1 . '</a>' : '') . ' ' . (($t1 = strval(interdire_scripts(typo(supprimer_numero(calculer_url($Pile[$SP]['url_site'], $Pile[$SP]['nom_site'], 'titre', $connect, false)), "TYPO", $connect, $Pile[0])))) !== '' ? '<span style="text-align: right;"><a href="' . calculer_url($Pile[$SP]['url_site'], '', 'url', $connect) . '" ' . (($t2 = strval(interdire_scripts(attribut_html(supprimer_tags(safehtml($Pile[$SP]['descriptif'])))))) !== '' ? 'title="' . $t2 . '"' : '') . ' class="spip_out" style="text-align: right; color: maroon; margin-top:-.5em">' . $t1 . '</a></span>' : '') . ' </li> '; } $iter->free(); } if (defined("_BOUCLE_PROFILER") and 1000 * ($timer = time() + microtime() - $timer) > _BOUCLE_PROFILER) { spip_log(intval(1000 * $timer) . "ms BOUCLE_art_syndic @ squelettes/inc/inc-syndic.html", "profiler" . _LOG_AVERTISSEMENT); } return $t0; }
function filtre_text_html_dist($t) { if (!preg_match(',^(.*?)<body[^>]*>(.*)</body>,is', $t, $r)) { return appliquer_filtre($t, 'text/plain'); } list(, $h, $t) = $r; $style = ''; // recuperer les styles internes if (preg_match_all(',<style>(.*?)</style>,is', $h, $r, PREG_PATTERN_ORDER)) { $style = join("\n", $r[1]); } // ... et externes include_spip('inc/distant'); if (preg_match_all(',<link[^>]+type=.text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER)) { foreach ($r[0] as $l) { preg_match("/href='([^']*)'/", str_replace('"', "'", $l), $m); $style .= "\n/* {$l} */\n" . str_replace('<', '', recuperer_page($m[1])); } } // Pourquoi SafeHtml transforme-t-il en texte les scripts dans Body ? $t = safehtml(preg_replace(',<script' . '.*?</script>,is', '', $t)); return (!$style ? '' : "\n<style>" . $style . "</style>") . $t; }
function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = false, $lang = "", $court = false) { changer_typo($lang); $lang_dir = lang_dir($lang); $nb_aff = 10; $champs = array('surtitre', 'titre', 'soustitre', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps'); if ($uniq_auteur) { $req_where = " AND articles.statut IN ('prepa','prop','publie')"; $req_where .= " AND versions.id_auteur = $uniq_auteur"; } else { $req_where = " AND articles.statut IN ('prop','publie')"; } if (strlen($lang) > 0) $req_where .= " AND articles.lang=" . sql_quote($lang); if ($id_secteur > 0) $req_where .= " AND articles.id_secteur = ".intval($id_secteur); $req_where = "versions.id_version > 1 $req_where"; $req_sel = "versions.id_version, versions.id_auteur, versions.date, versions.id_article, articles.statut, articles.titre"; $req_from = 'spip_versions AS versions LEFT JOIN spip_articles AS articles ON versions.id_article = articles.id_article'; $revisions = ''; $items = array(); $result = sql_select($req_sel, $req_from, $req_where, '', 'versions.date DESC', "$debut, $nb_aff"); while ($row = sql_fetch($result)) { $id_article = $row['id_article']; if (autoriser('voir','article',$id_article)){ $statut = $row['statut']; $id_version = $row['id_version']; $id_auteur = $row['id_auteur']; $date = $row['date']; $titre = typo(supprime_img($row['titre'],'')); // l'id_auteur peut etre un numero IP (edition anonyme) if ($id_auteur == intval($id_auteur) AND $row_auteur = sql_fetsel('nom,email', 'spip_auteurs', "id_auteur = ".sql_quote($id_auteur))) { $nom = typo($row_auteur["nom"]); $email = $row_auteur['email']; } else { $nom = $id_auteur; $email = ''; } $aff = revisions_bouton($id_article, $id_auteur, $id_version, $titre, $statut, $date, $lang_dir, $nom); if (!$court) { $bouton_id = "b$id_version-$id_article-$id_auteur"; $aff = bouton_block_depliable($aff,false,$bouton_id) . debut_block_depliable(false,$bouton_id) . safehtml(revisions_diff ($id_article, $id_version, $court)) . fin_block(); } $revisions .= "\n<div class='tr_liste' style='padding: 5px; border-top: 1px solid #aaaaaa;'>$aff</div>"; } } if (!$revisions) return ''; else return revisions_entete_boite($court, $debut, $id_secteur, $lang, $nb_aff, $req_from, $req_where, $uniq_auteur) . $revisions . fin_block() . fin_cadre(); }
// which 'quotes' all HTML-tags and special symbols // from user input function safehtml($s) { $s = str_replace("&", "&", $s); $s = str_replace("<", "<", $s); $s = str_replace(">", ">", $s); $s = str_replace("'", "'", $s); $s = str_replace("\"", """, $s); return $s; } if (isset($_POST['description'])) { $filename = $_POST['filename']; $size = filesize($upload_dir . '/' . $filename); $date = date('r', filemtime($upload_dir . '/' . $filename)); $description = safehtml($_POST['description']); // Let's generate file information page $html = <<<END <html><head><title>{$filename} [uploaded by IFRAME Async file uploader]</title></head> <body> <h1>{$filename}</h1> <p>This is a file information page for your uploaded file. Bookmark it, or send to anyone...</p> <p>Date: {$date}</p> <p>Size: {$size} bytes</p> <p>Description: <pre>{$description}</pre> </p> <p><a href="{$web_upload_dir}/{$filename}" style="font-size: large;">download file</a><br> <a href="uploadtest.php" style="font-size: small;">back to file uploading</a><br> <a href="{$web_upload_dir}/upload-log.html" style="font-size: small;">upload-log</a></p> <br><br>Example by <a href="http://www.anyexample.com/">AnyExample</a>
/** * filtre appliquant les traitements SPIP d'un champ (et eventuellement d'un type d'objet) sur un texte * (voir la fonction champs_traitements($p) dans : public/references.php) * ce mecanisme est a preferer au traditionnel #TEXTE*|propre * traitements_previsu() consulte la globale $table_des_traitements et applique le traitement adequat * si aucun traitement n'est trouve, alors propre() est applique * * @param string $texte : texte source * @param string $nom_champ : champ (en majuscules) * @param string $type_objet : objet (en minuscules) * @return string : texte traite */ function traitements_previsu($texte, $nom_champ='', $type_objet='', $connect=null) { include_spip('public/interfaces'); // charger les traitements safehtml($t); global $table_des_traitements; if(!strlen($nom_champ) || !isset($table_des_traitements[$nom_champ])) { $texte = propre($texte, $connect); } else { include_spip('base/abstract_sql'); $table = table_objet($type_objet); $ps = $table_des_traitements[$nom_champ]; if(is_array($ps)) $ps = $ps[(strlen($table) && isset($ps[$table])) ? $table : 0]; if(!$ps) $texte = propre($texte, $connect); else // remplacer le placeholder %s par le texte fourni eval('$texte=' . str_replace('%s', '$texte', $ps) . ';'); } // il faut toujours securiser le texte preivusalise car il peut contenir n'importe quoi // et servir de support a une attaque xss ou vol de cookie admin // on ne peut donc se fier au statut de l'auteur connecte car le contenu ne vient pas // forcement de lui return safehtml($texte); }
function controle_forum_boucle($row, $args) { $id_forum = $row['id_forum']; $forum_id_parent = $row['id_parent']; $forum_id_rubrique = $row['id_rubrique']; $forum_id_article = $row['id_article']; $forum_id_breve = $row['id_breve']; $forum_date_heure = $row['date_heure']; $forum_titre = echapper_tags($row['titre']); $forum_texte = $row['texte']; $forum_auteur = echapper_tags(extraire_multi($row['auteur'])); $forum_email_auteur = echapper_tags($row['email_auteur']); $forum_nom_site = echapper_tags($row['nom_site']); $forum_url_site = echapper_tags($row['url_site']); $forum_stat = $row['statut']; $forum_ip = $row['ip']; $forum_id_auteur = $row["id_auteur"]; $r = forum_parent($id_forum); $avant = $r['avant']; $url = $r['url']; $titre = $r['titre']; $type = $r['type']; $valeur = $r['valeur']; $pref = $r['pref']; if ($documents = sql_allfetsel('doc.id_document, doc.fichier AS fichier', 'spip_documents AS doc LEFT JOIN spip_documents_liens AS lien ON doc.id_document=lien.id_document', 'lien.id_objet='.intval($id_forum)." AND objet='forum'")) { include_spip('inc/documents'); foreach ($documents as $k => $t) { $h = generer_url_entite($t['id_document'], 'document'); $documents[$k] = "<a href='".$h."'>".basename($t['fichier'])."</a>"; } } switch($forum_stat) { case 'off': case 'privoff': $style = " style='border: 2px #ff0000 dashed;'"; break; case 'prop': $style = " style='border: 2px yellow solid; background-color: white;'"; break; case 'spam': $style = " style='border: 2px black dotted;'"; break; default: $style = ""; break; } if ($forum_email_auteur) { if (email_valide($forum_email_auteur)) $forum_email_auteur = "<a href='mailto:" .htmlspecialchars($forum_email_auteur) ."?subject=".rawurlencode($forum_titre)."'>".$forum_email_auteur ."</a>"; $forum_auteur .= " — $forum_email_auteur"; } $suite = "\n<br />$avant<b>$pref\n<a href='$url' class='controle'>$titre</a></b>" . "<div class='controle'>".justifier(propre($forum_texte))."</div>"; include_spip('public/composer'); if ($forum_notes = safehtml(calculer_notes())) $suite .= "<div class='notes controle'>".justifier(safehtml($forum_notes))."</div>"; if (strlen($forum_url_site) > 10 AND strlen($forum_nom_site) >= 3) $suite .= "\n<div style='text-align: left' class='serif'><b><a href='$forum_url_site'>$forum_nom_site</a></b></div>"; return "\n<div><br /><a id='forum$id_forum'></a></div>" . debut_cadre_forum("", true, "", typo($forum_titre)) . "<div$style>" . date_interface($forum_date_heure) . safehtml("<span class='arial2'> / <b>$forum_auteur</b></span>") . boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur, "$type=$valeur", $forum_ip, 'controle_forum', $args) . safehtml(lignes_longues($suite)) . afficher_forum_mots($id_forum) . join(', ', $documents) . "<div class='nettoyeur'></div></div>". fin_cadre_forum(true); }
function inclure_previsu($texte,$titre, $url_site, $nom_site, $ajouter_mot, $doc, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic) { global $table_des_traitements; $bouton = _T('forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // appliquer les traitements de #TEXTE a la previsu // comme on voit c'est complique... y a peut-etre plus simple ? // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises include_spip('public/parametrer'); $evaltexte = isset($table_des_traitements['TEXTE']['forums']) ? $table_des_traitements['TEXTE']['forums'] : $table_des_traitements['TEXTE'][0]; $evaltexte = '$tmptexte = '.str_replace('%s', '$texte', $evaltexte).';'; // evaluer... eval($evaltexte); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\b@ism", '<\1div', inclure_balise_dynamique(array('formulaires/inc-forum_previsu', 0, array( 'titre' => safehtml(typo($titre)), 'texte' => $tmptexte, 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)), 'ajouter_document' => $doc, 'erreur' => $erreur, 'bouton' => $bouton, 'id_rubrique' => $id_rubrique, 'id_forum' => $id_forum, 'id_article' => $id_article, 'id_breve' => $id_breve, 'id_syndic' => $id_syndic ) ), false)); }
$id = $item['id']; $filename = strip_tags($item['filename']); $added = strip_tags(date("d/m/Y H:i:s", $item['added'])); $descr = format_comment($item['description'] . "\n"); $seeders = strip_tags($item['seeders']); $leechers = strip_tags($item['leechers']); // output to browser ?> <item> <title><![CDATA[<?php print htmlspecialchars("[" . TORRENT . "] " . $filename); ?> ]]></title> <description><![CDATA[<?php print $descr . " (" . SEEDERS . " " . safehtml($seeders) . " -- " . LEECHERS . " " . safehtml($leechers); ?> )]]></description> <link><?php print $BASEURL; ?> /index.php?page=torrent-details&id=<?php print $id; ?> </link> <pubDate><?php print $added; ?> </pubDate> </item>
/** * Filtre appliquant les traitements SPIP d'un champ * * Applique les filtres prévus sur un champ (et eventuellement un type d'objet) * sur un texte donné. Sécurise aussi le texte en appliquant safehtml(). * * Ce mécanisme est à préférer au traditionnel #TEXTE*|propre * * traitements_previsu() consulte la globale $table_des_traitements et * applique le traitement adequat. Si aucun traitement n'est trouvé, * alors propre() est appliqué. * * @package SPIP\PortePlume\Fonctions * @see champs_traitements() dans public/references.php * @global table_des_traitements * * @param string $texte * Texte source * @param string $nom_champ * Nom du champ (nom de la balise, en majuscules) * @param string $type_objet * L'objet a qui appartient le champ (en minuscules) * @param string $connect * Nom du connecteur de base de données * @return string * Texte traité avec les filtres déclarés pour le champ. */ function traitements_previsu($texte, $nom_champ = '', $type_objet = '', $connect = null) { include_spip('public/interfaces'); // charger les traitements global $table_des_traitements; if (!strlen($nom_champ) || !isset($table_des_traitements[$nom_champ])) { $texte = propre($texte, $connect); } else { include_spip('base/abstract_sql'); $table = table_objet($type_objet); $ps = $table_des_traitements[$nom_champ]; if (is_array($ps)) { $ps = $ps[strlen($table) && isset($ps[$table]) ? $table : 0]; } if (!$ps) { $texte = propre($texte, $connect); } else { // [FIXME] Éviter une notice sur le eval suivant qui ne connait // pas la Pile ici. C'est pas tres joli... $Pile = array(0 => array()); // remplacer le placeholder %s par le texte fourni eval('$texte=' . str_replace('%s', '$texte', $ps) . ';'); } } // il faut toujours securiser le texte prévisualisé car il peut contenir n'importe quoi // et servir de support a une attaque xss ou vol de cookie admin // on ne peut donc se fier au statut de l'auteur connecté car le contenu ne vient pas // forcément de lui return safehtml($texte); }
/** * 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; }
$postid = (int) $item['postid']; $forum = strip_tags($item['name']); $subject = strip_tags($item['subject']); $added = strip_tags(date("d/m/Y H:i:s", $item['added'])); $body = format_comment("[b]Author: " . security::html_safe($item['username']) . "[/b]\n\n" . security::html_safe($item['body']) . "\n"); // output to browser $link = security::html_safe($BASEURL . "/forum.php?action=viewtopic&topicid=" . $topicid . "&page=p" . $postid . "#" . $postid); ?> <item> <title><?php print safehtml("[" . FORUM . "] " . $forum . " - " . $subject); ?> </title> <description><?php print safehtml($body); ?> </description> <link><?php print $link; ?> </link> <pubDate><?php print $added; ?> </pubDate> </item> <?php } }
/** * Preparer la previsu d'un message de forum * * http://code.spip.net/@inclure_previsu * * @param string $texte * @param string $titre * @param string $url_site * @param string $nom_site * @param array $ajouter_mot * @param array $doc * @param string $objet * @param int $id_objet * @param int $id_forum * @return string */ function inclure_previsu($texte, $titre, $url_site, $nom_site, $ajouter_mot, $doc, $objet, $id_objet, $id_forum) { global $table_des_traitements; $bouton = _T('forum:forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // appliquer les traitements de #TEXTE a la previsu // comme on voit c'est complique... y a peut-etre plus simple ? // recuperer les filtres eventuels de 'mes_fonctions.php' sur les balises include_spip('public/parametrer'); $tmptexte = ""; $evaltexte = isset($table_des_traitements['TEXTE']['forums']) ? $table_des_traitements['TEXTE']['forums'] : $table_des_traitements['TEXTE'][0]; $evaltexte = '$tmptexte = ' . str_replace('%s', '$texte', $evaltexte) . ';'; // evaluer... // [fixme] // $connect et $Pile ne sont pas definis ici :/ // mais font souvent partie des variables appelees par les traitements $connect = ""; $Pile = array(0 => array()); eval($evaltexte); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\\b@ism", '<\\1div', inclure_balise_dynamique(array('formulaires/inc-forum_previsu', 0, array('titre' => safehtml(typo($titre)), 'texte' => $tmptexte, 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot), 'ajouter_document' => $doc, 'bouton' => $bouton, 'objet' => $objet, 'id_objet' => $id_objet, 'id_forum' => $id_forum)), false)); }
function afficher_forum_auteur($row) { $titre=$row['titre']; $id_auteur=$row["id_auteur"]; $date_heure=$row['date_heure']; $email_auteur=$row['email_auteur']; $auteur= extraire_multi($row['auteur']); if ($id_auteur) { $formater_auteur = charger_fonction('formater_auteur', 'inc'); $res = join(' ',$formater_auteur($id_auteur)); } else { if ($email_auteur) { if (email_valide($email_auteur)) $email_auteur = "<a href='mailto:" .htmlspecialchars($email_auteur) ."?subject=".rawurlencode($titre)."'>".$email_auteur ."</a>"; $auteur .= " — $email_auteur"; } $res = safehtml("<span class='arial2'> / <b>$auteur</b></span>"); } return "<div style='font-weight: normal;'>" . date_interface($date_heure) . " $res</div>"; }
function inclure_forum_prive_previsu($texte, $titre, $url_site, $nom_site, $ajouter_mot, $doc = "") { $bouton = _T('forum:forum_message_definitif'); include_spip('public/assembler'); include_spip('public/composer'); // supprimer les <form> de la previsualisation // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums) return preg_replace("@<(/?)form\\b@ism", '<\\1div', inclure_balise_dynamique(array('formulaires/inc-forum_prive_previsu', 0, array('titre' => safehtml(typo($titre)), 'texte' => safehtml(propre($texte)), 'notes' => safehtml(calculer_notes()), 'url_site' => vider_url($url_site), 'nom_site' => safehtml(typo($nom_site)), 'ajouter_mot' => is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot), 'ajouter_document' => $doc, 'bouton' => $bouton)), false)); }
function verifier_visiteur() { // Rq: pour que cette fonction marche depuis mes_options // il faut forcer l'init si ce n'est fait // mais on risque de perturber des plugins en initialisant trop tot // certaines constantes @spip_initialisation_core(_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES, _DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES, _DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES, _DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES); // Demarrer une session NON AUTHENTIFIEE si on donne son nom // dans un formulaire sans login (ex: #FORMULAIRE_FORUM) // Attention on separe bien session_nom et nom, pour eviter // les melanges entre donnees SQL et variables plus aleatoires $variables_session = array('session_nom', 'session_email'); foreach ($variables_session as $var) { if (_request($var) !== null) { $init = true; break; } } if (isset($init)) { #@spip_initialisation_suite(); $session = charger_fonction('session', 'inc'); $session(); include_spip('inc/texte'); foreach ($variables_session as $var) { if (($a = _request($var)) !== null) { $GLOBALS['visiteur_session'][$var] = safehtml($a); } } if (!isset($GLOBALS['visiteur_session']['id_auteur'])) { $GLOBALS['visiteur_session']['id_auteur'] = 0; } $session($GLOBALS['visiteur_session']); return 0; } $h = (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http']); if ($h or isset($_COOKIE['spip_session']) or isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) { $session = charger_fonction('session', 'inc'); if ($session()) { return $GLOBALS['visiteur_session']['statut']; } if ($h and isset($_SERVER['PHP_AUTH_PW'])) { include_spip('inc/auth'); $h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); } if ($h) { $GLOBALS['visiteur_session'] = $h; return $GLOBALS['visiteur_session']['statut']; } } // au moins son navigateur nous dit la langue preferee de cet inconnu include_spip('inc/lang'); utiliser_langue_visiteur(); return false; }
function glossaire_safe($texte) { // on retire les notes avant propre() return safehtml(propre(preg_replace(', *\[\[(.*?)\]\],msS', '', nl2br(trim($texte))))); }