Skip to content
Permalink
Browse files Browse the repository at this point in the history
Divers petites sanitization et une balise manquante #4494
  • Loading branch information
Cerdic authored and Gitea committed Jun 25, 2020
1 parent 6e878b8 commit 6c16507
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 6 deletions.
11 changes: 11 additions & 0 deletions ecrire/inc/filtres.php
Expand Up @@ -403,6 +403,17 @@ function filtre_setenv(&$Pile, $val, $key, $continue = null) {
return $continue ? $val : '';
}

/**
* @param array $Pile
* @param array|string $keys
* @return string
*/
function filtre_sanitize_env(&$Pile, $keys) {
$Pile[0] = spip_sanitize_from_request($Pile[0], $keys);
return '';
}


/**
* Filtre `debug` qui affiche un debug de la valeur en entrée
*
Expand Down
8 changes: 4 additions & 4 deletions ecrire/inc/precharger_objet.php
Expand Up @@ -50,7 +50,7 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c

// si l'objet existe deja, on retourne simplement ses valeurs
if (is_numeric($id_objet)) {
return sql_fetsel("*", $table, "$_id_objet=$id_objet");
return sql_fetsel("*", $table, "$_id_objet=".intval($id_objet));
}

// ici, on demande une creation.
Expand Down Expand Up @@ -133,7 +133,7 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t
$_id_objet = id_table_objet($table);

// Recuperer les donnees de l'objet original
$row = sql_fetsel("*", $table, "$_id_objet=$lier_trad");
$row = sql_fetsel("*", $table, "$_id_objet=".intval($lier_trad));
if ($row) {
include_spip('inc/filtres');
$row[$champ_titre] = filtrer_entites(objet_T($type, 'info_nouvelle_traduction')) . ' ' . $row[$champ_titre];
Expand Down Expand Up @@ -172,12 +172,12 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t
$id_parent = 0;
} else {
// on cherche une rubrique soeur dans la bonne langue
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_rubrique");
$row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=".intval($id_rubrique));
$id_parent = $row_rub['id_parent'];
}

$row_rub = sql_fetsel("id_rubrique", "spip_rubriques",
"lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=$id_parent");
"lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=".intval($id_parent));
if ($row_rub) {
$row['id_rubrique'] = $row_rub['id_rubrique'];
}
Expand Down
37 changes: 37 additions & 0 deletions ecrire/inc/utils.php
Expand Up @@ -446,6 +446,43 @@ function set_request($var, $val = null, $c = false) {
return false; # n'affecte pas $c
}

/**
* Sanitizer une valeur *SI* elle provient du GET ou POST
* Utile dans les squelettes pour les valeurs qu'on attrape dans le env,
* dont on veut permettre à un squelette de confiance appelant de fournir une valeur complexe
* mais qui doit etre nettoyee si elle provient de l'URL
*
* On peut sanitizer
* - une valeur simple : `$where = spip_sanitize_from_request($value, 'where')`
* - un tableau en partie : `$env = spip_sanitize_from_request($env, ['key1','key2'])`
* - un tableau complet : `$env = spip_sanitize_from_request($env, '*')`
*
* @param string|array $value
* @param string|array $key
* @param string $sanitize_function
* @return array|mixed|string
*/
function spip_sanitize_from_request($value, $key, $sanitize_function='entites_html') {
if (is_array($value)) {
if ($key=='*') {
$key = array_keys($value);
}
if (!is_array($key)) {
$key = [$key];
}
foreach ($key as $k) {
if (!empty($value[$k])) {
$value[$k] = spip_sanitize_from_request($value[$k], $k, $sanitize_function);
}
}
return $value;
}
// si la valeur vient des GET ou POST on la sanitize
if (!empty($value) and $value == _request($key)) {
$value = $sanitize_function($value);
}
return $value;
}

/**
* Tester si une URL est absolue
Expand Down
7 changes: 7 additions & 0 deletions ecrire/public/aiguiller.php
Expand Up @@ -15,6 +15,13 @@
}

function securiser_redirect_action($redirect) {
// cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
if (strpos($redirect, '%') !== false) {
$r2 = urldecode($redirect);
if (($r3 = securiser_redirect_action($r2)) !== $r2) {
return $r3;
}
}
if ((tester_url_absolue($redirect) or preg_match(',^\w+:,',trim($redirect)))
and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
// si l'url est une url du site, on la laisse passer sans rien faire
Expand Down
13 changes: 13 additions & 0 deletions ecrire/public/balises.php
Expand Up @@ -1691,6 +1691,19 @@ function balise_REM_dist($p) {
return $p;
}

/**
* Une balise #NULL quand on a besoin de passer un argument null sur l'appel d'un filtre ou formulaire
* (evite un #EVAL{null})
* @param $p
* @return mixed
*/
function balise_NULL_dist($p) {
$p->code = "null";
$p->interdire_scripts = false;

return $p;
}


/**
* Compile la balise `#HTTP_HEADER` envoyant des entêtes de retour HTTP
Expand Down
4 changes: 2 additions & 2 deletions ecrire/public/criteres.php
Expand Up @@ -1557,11 +1557,11 @@ function critere_where_dist($idb, &$boucles, $crit) {
if (isset($crit->param[0])) {
$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
} else {
$_where = '@$Pile[0]["where"]';
$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
}

if ($crit->cond) {
$_where = "(($_where) ? ($_where) : '')";
$_where = "((\$zzw = $_where) ? \$zzw : '')";
}

if ($crit->not) {
Expand Down
1 change: 1 addition & 0 deletions prive/formulaires/editer_logo.php
Expand Up @@ -61,6 +61,7 @@ function formulaires_editer_logo_charger_dist($objet, $id_objet, $retour = '', $
if (!is_array($options)) {
$options = unserialize($options);
}
$options = spip_sanitize_from_request($options, '*');

if (!isset($options['titre'])) {
$balise_img = chercher_filtre('balise_img');
Expand Down
1 change: 1 addition & 0 deletions prive/squelettes/structure.html
Expand Up @@ -5,5 +5,6 @@
<head>
<INCLURE{fond=prive/squelettes/head/#ENV{type-page},env,espace_prive=1}>
</head>
[(#LISTE{titre,sinon}|sanitize_env)]
<INCLURE{fond=prive/squelettes/body,env,espace_prive=1}>
</html>

0 comments on commit 6c16507

Please sign in to comment.