Browse Source

securite :

- deplacer le squelette de preview dans prive/ pour ne pas permettre sa consultation directe
- ajouter un autoriser() dans l'action previsu pour fermer la porte lorsque le porte plume est desactive dans le public
- dans tous les cas faire passer le resultat par safehtml car le texte source peut venir de n'importe qui/n'importe ou et peut servir de support a une attaque type XSS ou vol de cookie (l'utilisation d'un $_POST explicite exclue toutefois le simple lien)
2.1 v1.7.2
cedric@yterium.com 13 years ago
parent
commit
84d4931352
  1. 4
      .gitattributes
  2. 13
      action/porte_plume_previsu.php
  3. 34
      inc/barre_outils.php
  4. 7
      plugin.xml
  5. 18
      porte_plume_pipelines.php
  6. 5
      porte_plume_start.js.html
  7. 0
      prive/porte_plume_preview.html
  8. 0
      prive/porte_plume_preview_fonctions.php

4
.gitattributes vendored

@ -62,11 +62,11 @@ markitup/templates/preview.html -text
/plugin.xml -text
/porte_plume_options.php -text
/porte_plume_pipelines.php -text
/porte_plume_preview.html -text
/porte_plume_preview_fonctions.php -text
/porte_plume_start.js.html -text
/porte_plume_start.js_fonctions.php -text
prive/configurer/porte_plume.html -text
prive/porte_plume_preview.html -text
prive/porte_plume_preview_fonctions.php -text
tests/all_tests.php -text
tests/barre_outil_markitup.php -text
tests/lanceur_spip.php -text

13
action/porte_plume_previsu.php

@ -13,6 +13,17 @@
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_porte_plume_previsu_dist(){
echo recuperer_fond('porte_plume_preview',$_POST);
// $_POST a ete sanitise par SPIP
// et le fond injecte des interdire_scripts pour empecher les injections PHP
// le js est bloque ou non selon les reglages de SPIP et si on est ou non dans l'espace prive
$contexte = $_POST;
// mais il faut avoir le droit de previsualiser
// (par defaut le droit d'aller dans ecrire/)
if (!autoriser('previsualiser','porte_plume'))
$contexte = array();
echo recuperer_fond('prive/porte_plume_preview',$contexte);
}
?>

34
inc/barre_outils.php

@ -556,18 +556,28 @@ function barre_outils_liste(){
* @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]))
return propre($texte, $connect);
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)
return propre($texte, $connect);
// remplacer le placeholder %s par le texte fourni
eval('$texte=' . str_replace('%s', '$texte', $ps) . ';');
return $texte;
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);
}
?>

7
plugin.xml

@ -2,7 +2,7 @@
<nom><multi>[fr]Porte plume[en]Quill[ar]&#1575;&#1604;&#1585;&#1610;&#1588;&#1577;</multi></nom>
<auteur>Matthieu Marcillaud</auteur>
<licence>GNU/GPL</licence>
<version>1.7.1</version>
<version>1.7.2</version>
<description>
<multi>[fr]Une barre d'outil pour bien &eacute;crire
_ Porte plume est une barre d'outil extensible pour SPIP qui
@ -29,6 +29,11 @@ _ &#1575;&#1604;&#1585;&#1610;&#1588;&#1577; &#1607;&#1610; &#1588;&#1585;&#1610
<options>porte_plume_options.php</options>
<fonctions>inc/barre_outils.php</fonctions>
<pipeline>
<nom>autoriser</nom>
<inclure>porte_plume_pipelines.php</inclure>
</pipeline>
<pipeline>
<nom>insert_head</nom>
<action>insert_head_public</action>

18
porte_plume_pipelines.php

@ -6,6 +6,24 @@
*/
#define('PORTE_PLUME_PUBLIC', true);
function porte_plume_autoriser($flux){return $flux;}
/**
* Autoriser l'action de previsu : la fermer aux non identifies
* si pas de porte plume dans le public
* @param string $faire
* @param string $type
* @param int $id
* @param array $qui
* @param array $opt
* @return bool
*/
function autoriser_porte_plume_previsualiser_dist($faire, $type, $id, $qui, $opt){
return
(test_espace_prive() AND autoriser('ecrire'))
OR (!test_espace_prive() AND autoriser('afficher_public','porte_plume'));
}
// autoriser le porte plume dans le public ?
function autoriser_porte_plume_afficher_public_dist($faire, $type, $id, $qui, $opt) {
// compatibilite d'avant le formulaire de configuration

5
porte_plume_start.js.html

@ -1,7 +1,8 @@
#CACHE{7*24*3600}
#HTTP_HEADER{Content-Type: text/javascript; charset=#CHARSET}
[(#REM) chargement des definitions des barres d'outils ]
[(#REM) chargement des definitions des barres d'outils
<script>]
[(#VAL|porte_plume_creer_json_markitup)]
@ -23,7 +24,7 @@ $.fn.barre_outils = function(nom, settings) {
$.fn.barre_previsualisation = function(settings) {
options = {
previewParserPath:"[(#URL_ACTION{porte_plume_previsu}|url_absolue)]",
previewParserPath:"index.php?action=porte_plume_previsu", // ici une url relative pour prive/public
textEditer:"<:barre_outils:editer:>",
textVoir:"<:barre_outils:voir:>"
};

0
porte_plume_preview.html → prive/porte_plume_preview.html

0
porte_plume_preview_fonctions.php → prive/porte_plume_preview_fonctions.php

Loading…
Cancel
Save