Browse Source

On introduit un sanitizer explicite, definissable extension par extension, car sanitizer dans la fonction de lecture des metadata est tout sauf propre et fiable

issue_4494
Cerdic 3 years ago
parent
commit
871b40cb9c
  1. 5
      action/ajouter_documents.php
  2. 19
      inc/renseigner_document.php
  3. 2
      paquet.xml
  4. 40
      sanitizer/svg.php

5
action/ajouter_documents.php

@ -202,6 +202,11 @@ function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet,
}
}
// voir si le document a besoin d'un nettoyage et le cas echeant relire ses infos apres
if (sanitizer_document($champs['fichier'], $champs['extension'])) {
$infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension']);
}
$champs = array_merge($champs, $infos);
// Si mode == 'choix', fixer le mode image/document

19
inc/renseigner_document.php

@ -159,3 +159,22 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
return $infos;
}
/**
* @param string $fichier
* @param string $ext
* @return bool
*/
function sanitizer_document($fichier, $ext) {
// verifier que le fichier existe, sinon on ne peut rien faire
if (
!$fichier
or !@file_exists($fichier)) {
return false;
}
if ($sanitizer = charger_fonction($ext, 'sanitizer', true)){
return $sanitizer($fichier);
}
return false;
}

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="medias"
categorie="multimedia"
version="2.26.0"
version="2.26.1"
etat="stable"
compatibilite="[3.3.0-dev;3.3.*]"
logo="prive/themes/spip/images/portfolio-32.png"

40
metadata/svg.php → sanitizer/svg.php

@ -24,16 +24,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
include_spip('inc/autoriser');
/**
* Déterminer les dimensions d'un svg, et enlever ses scripts si nécessaire
* Nettoyer et normaliser 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) {
function sanitizer_svg_dist($file) {
include_spip('inc/svg');
if ($svg = svg_charger($file)) {
@ -55,27 +54,32 @@ function metadata_svg_dist($file) {
include_spip('lib/svg-sanitizer/src/data/TagInterface');
include_spip('lib/svg-sanitizer/src/data/AllowedTags');
$sanitizer = new Sanitizer();
$sanitizer->setXMLOptions(0); // garder les balises vide en ecriture raccourcie
// sanitization can need multiples call
$maxiter = 10;
do {
$size = strlen($svg);
$sanitizer = new Sanitizer();
$sanitizer->setXMLOptions(0); // garder les balises vide en ecriture raccourcie
// Pass it to the sanitizer and get it back clean
$svg = $sanitizer->sanitize($svg);
// Pass it to the sanitizer and get it back clean
$svg = $sanitizer->sanitize($svg);
// loger les sanitization
$trace = "";
foreach ($sanitizer->getXmlIssues() as $issue) {
$trace .= $issue['message'] . " L".$issue['line']."\n";
}
if ($trace) {
spip_log($trace, "svg" . _LOG_DEBUG);
}
// loger les sanitization
$trace = "";
foreach ($sanitizer->getXmlIssues() as $issue) {
$trace .= $issue['message'] . " L".$issue['line']."\n";
}
if ($trace) {
spip_log($trace, "svg" . _LOG_DEBUG);
}
} while (strlen($svg) !== $size and $maxiter-->0);
}
ecrire_fichier($file, $svg);
$metadata = charger_fonction('image', 'metadata');
return $metadata($file);
clearstatcache();
return true;
}
// pas de svg valide
return array();
return false;
}
Loading…
Cancel
Save