Browse Source

Ferme #2602 : les traitements "catch-all" sur les champ '*' (utilisés pour passer safehtml dans une boucle DATA) ne sont appliqués que sur les balises non calculées par une fonction explicite balise_XXX.

Pour cela on ajoute un flag balise_calculee dans l'objet Champ, et on declare explicitement le traitement safehtml sur la balise #VALEUR dans DATA puisqu'elle est calculee et n'est plus protégée par la déclaration de traitement sur *
3.0
Cerdic 11 years ago
parent
commit
d4b52bcb89
  1. 4
      ecrire/public/interfaces.php
  2. 14
      ecrire/public/references.php

4
ecrire/public/interfaces.php

@ -126,6 +126,8 @@ class Champ {
var $descr = array();
// pour localiser les erreurs
var $ligne = 0;
// un flag pour reperer les balises calculees par une fonction explicite
var $balise_calculee = false;
}
@ -242,6 +244,8 @@ function declarer_interfaces(){
$table_des_traitements['*'][]= false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
// toujours securiser les DATA
$table_des_traitements['*']['DATA']= 'safehtml(%s)';
// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
$table_des_traitements['VALEUR']['DATA']= 'safehtml(%s)';
// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales

14
ecrire/public/references.php

@ -196,7 +196,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
* http://doc.spip.org/@champ_sql
*
* @param string $champ
* champ recherché
* champ recherch<EFBFBD>
* @param object $p
* contexte de compilation
* @param bool $joker
@ -229,6 +229,7 @@ function calculer_balise($nom, $p) {
// S'agit-t-il d'une balise_XXXX[_dist]() ?
if ($f = charger_fonction($nom, 'balise', true)) {
$p->balise_calculee = true;
$res = $f($p);
if ($res !== NULL)
return $res;
@ -384,8 +385,15 @@ function champs_traitements ($p) {
if (isset($table_des_traitements[$p->nom_champ]))
$ps = $table_des_traitements[$p->nom_champ];
else
$ps = $table_des_traitements['*'];
else {
// quand on utilise un traitement catch-all *
// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
// leur propre securite
if (!$p->balise_calculee)
$ps = $table_des_traitements['*'];
else
$ps = false;
}
if (is_array($ps)) {
// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte

Loading…
Cancel
Save