[SPIP] v3.2.7-->v3.2.9
[lhc/web/www.git] / www / ecrire / inc / utils.php
index 22c0c32..a89658a 100644 (file)
@@ -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
@@ -3125,7 +3162,18 @@ function exec_info_dist() {
 
        include_spip('inc/autoriser');
        if (autoriser('webmestre')) {
+               $cookies_masques = ['spip_session', 'PHPSESSID'];
+               $cookies_backup = [];
+               foreach ($cookies_masques as $k) {
+                       if (!empty($_COOKIE[$k])) {
+                               $cookies_backup[$k] = $_COOKIE[$k];
+                               $_COOKIE[$k] = '******************************';
+                       }
+               }
                phpinfo();
+               foreach ($cookies_backup as $k => $v) {
+                       $_COOKIE[$k] = $v;
+               }
        } else {
                include_spip('inc/filtres');
                sinon_interdire_acces();
@@ -3585,4 +3633,21 @@ if (PHP_VERSION_ID < 50500) {
                }
 
        }
+}
+
+/**
+ * Nettoie une chaine pour servir comme classes CSS.
+ *
+ * @note
+ *     les classes CSS acceptent théoriquement tous les caractères sauf NUL.
+ *     Ici, on limite (enlève) les caractères autres qu’alphanumérique, espace, - + _ @
+ *
+ * @param string|string[] $classes
+ * @return string|string[]
+ */
+function spip_sanitize_classname($classes) {
+       if (is_array($classes)) {
+               return array_map('spip_sanitize_classname', $classes);
+       }
+       return preg_replace("/[^ 0-9a-z_\-+@]/i", "", $classes);
 }
\ No newline at end of file