Skip to content
Extraits de code Groupes Projets
Valider 311b741b rédigé par cerdic's avatar cerdic
Parcourir les fichiers

feat: séparer la fonction qui sanitize le source du SVG pour pouvoir...

feat: séparer la fonction qui sanitize le source du SVG pour pouvoir l'utiliser dans un autre contexte

Refs: spip/safehtml#4786
parent 22193f14
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -29,13 +29,21 @@ include_spip('inc/autoriser'); ...@@ -29,13 +29,21 @@ include_spip('inc/autoriser');
* cf http://www.slideshare.net/x00mario/the-image-that-called-me * cf http://www.slideshare.net/x00mario/the-image-that-called-me
* http://heideri.ch/svgpurifier/SVGPurifier/index.php * http://heideri.ch/svgpurifier/SVGPurifier/index.php
* *
* @param string $file * @param string $file_or_svg
* @return array Tableau (largeur, hauteur) * @return bool
*/ */
function sanitizer_svg_dist($file) { function sanitizer_svg_dist($file_or_svg) {
include_spip('inc/svg'); include_spip('inc/svg');
if ($svg = svg_charger($file)) { if ($svg = svg_charger($file_or_svg)) {
if ($svg === $file_or_svg) {
$file = false;
}
else {
$file = $file_or_svg;
}
unset($file_or_svg);
// forcer une viewBox et width+height en px // forcer une viewBox et width+height en px
$svg = svg_force_viewBox_px($svg, true); $svg = svg_force_viewBox_px($svg, true);
...@@ -46,43 +54,7 @@ function sanitizer_svg_dist($file) { ...@@ -46,43 +54,7 @@ function sanitizer_svg_dist($file) {
// qu'on soit admin ou non, on sanitize les SVGs car rien ne dit qu'un admin sait que ca contient du JS // qu'on soit admin ou non, on sanitize les SVGs car rien ne dit qu'un admin sait que ca contient du JS
// and !autoriser('televerser', 'script') // and !autoriser('televerser', 'script')
) { ) {
spip_log("sanitization SVG $file", 'svg'); $svg = sanitizer_svg_string($svg, $file);
if (!class_exists('enshrined\svgSanitize\Sanitizer')) {
spl_autoload_register(function ($class) {
$prefix = 'enshrined\\svgSanitize\\';
$base_dir = _DIR_PLUGIN_MEDIAS . 'lib/svg-sanitizer/src/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
}
// 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);
// 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); ecrire_fichier($file, $svg);
...@@ -93,3 +65,52 @@ function sanitizer_svg_dist($file) { ...@@ -93,3 +65,52 @@ function sanitizer_svg_dist($file) {
// pas de svg valide // pas de svg valide
return false; return false;
} }
/**
* @param string $svg
* @param string $fileName
* @return false|string
*/
function sanitizer_svg_string($svg, $fileName = '') {
$tracesvg = ($fileName ?: substr($svg, 0,32)."...(".strlen($svg). "c ". md5($svg) . ")");
spip_log("sanitization SVG $tracesvg", 'svg' . _LOG_DEBUG);
if (!class_exists('enshrined\svgSanitize\Sanitizer')) {
spl_autoload_register(function ($class) {
$prefix = 'enshrined\\svgSanitize\\';
$base_dir = _DIR_PLUGIN_MEDIAS . 'lib/svg-sanitizer/src/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
}
// 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);
// 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);
return $svg;
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter