esw_svg_allowed_attributes
Filtert die Attributnamen, die Easy SVG an SVG-Elementen behält: Erlaube ein Darstellungsattribut aus deinem Export oder streiche, was du nie willst.
Filter · Easy SVG · Status: Stabil
Wenn Easy SVG ein SVG bereinigt, verliert jedes Element alle Attribute, deren Name nicht auf einer Erlaubnisliste steht. Dieser Filter gibt dir diese Liste. Ergänzt du ein Attribut, das dein Design-Tool schreibt, bleibt es in deinen Dateien erhalten. Streichst du eines, wird es ab sofort aus jedem SVG entfernt, das die Site speichert.
Verwendung
apply_filters( 'esw_svg_allowed_attributes', array $attributes )
add_filter( 'esw_svg_allowed_attributes', 'myplugin_svg_attributes' );
Wann du es brauchst
- Dein Export enthält ein Darstellungsattribut, das die Bibliothek noch nicht kennt, etwa
transform-originodermask-type, und die Grafik sieht nach dem Upload anders aus. - Du brauchst ein Barrierefreiheits-Attribut, das die eingebaute
aria-*-Regel nicht abdeckt, zum Beispielfocusable. - Deine Site soll strenger sein als der Standard und reine HTML-Attribute wie
srcodersrcsetaus jedem SVG entfernen.
Lass es bleiben:
- Für Event-Handler. Nichts, was mit
onbeginnt, gehört auf diese Liste. - Um
aria-*- oderdata-*-Attribute zu behalten oder zu entfernen. Die behält die Bibliothek von sich aus, egal was auf der Liste steht. - Für Editor-Metadaten wie
inkscape:label. Die kannst du gefahrlos verlieren, sie machen Dateien nur größer.
Parameter
Ein flaches, numerisch indiziertes Array mit Attributnamen, zum Beispiel array( 'about', 'accept', 'action', ... ). Ohne weitere Callbacks ist das die Standardliste der mitgelieferten Bibliothek enshrined/svg-sanitize: 328 Einträge in Version 1.0.0, aus HTML, SVG, MathML und ein paar XML-Namen wie xlink:href und xml:space. Verglichen wird ohne Rücksicht auf Groß- und Kleinschreibung mit dem Attributnamen, wie er in der Datei steht, samt Präfix (xlink:href, inkscape:label).
Rückgabewert
Die Attributnamen, die der Sanitizer behalten darf. Es muss ein Array sein. Alles andere lässt die Bibliothek beim Aufbau des Sanitizers einen TypeError werfen, und der Upload endet mit einem fatalen Fehler.
Standardwert
Die Liste AllowedAttributes aus enshrined/svg-sanitize 1.0.0, unverändert. Gut zu wissen:
- Schon enthalten:
id,class,style,role,tabindex,href,xlink:href,viewbox,preserveaspectratio,transform, alle gängigen Darstellungsattribute (fill,stroke,stroke-width,opacity,clip-path,mask,filter, Schriftattribute) und die Zeitattribute für Animationen (attributename,values,begin,dur). - Nicht enthalten, also entfernt: alle
on*-Handler,focusable,transform-origin,mask-type,from,to,xml:langund Editor-Namespaces wieinkscape:*undsodipodi:*. - Immer behalten, unabhängig von der Liste: jeder Name, der mit
aria-oderdata-beginnt.
Beispiele
focusable für ältere Screenreader behalten
Das ist das Beispiel aus dem Readme des Plugins.
/**
* focusable="false" an eingebetteten SVG-Icons behalten.
*
* @param string[] $attributes Erlaubte Attributnamen.
* @return string[]
*/
function myplugin_allow_focusable( $attributes ) {
$attributes[] = 'focusable';
return $attributes;
}
add_filter( 'esw_svg_allowed_attributes', 'myplugin_allow_focusable' );
Neuere Darstellungsattribute aus deinem Export behalten
/**
* Darstellungsattribute behalten, die neuere Design-Tools schreiben.
*
* @param string[] $attributes Erlaubte Attributnamen.
* @return string[]
*/
function myplugin_allow_svg2_presentation( $attributes ) {
return array_merge( $attributes, array( 'transform-origin', 'mask-type' ) );
}
add_filter( 'esw_svg_allowed_attributes', 'myplugin_allow_svg2_presentation' );
Ohne das fällt mask-type="alpha" weg, die Maske arbeitet dann mit Helligkeit statt Transparenz, und die Form wird heller oder ganz unsichtbar.
HTML-Attribute mit URLs entfernen
/**
* Reine HTML-Attribute mit URLs aus jedem gespeicherten SVG entfernen.
*
* @param string[] $attributes Erlaubte Attributnamen.
* @return string[]
*/
function myplugin_strict_svg_attributes( $attributes ) {
if ( ! is_array( $attributes ) ) {
return array();
}
$blocked = array( 'src', 'srcset', 'poster', 'background', 'action' );
return array_values(
array_filter(
$attributes,
static function ( $name ) use ( $blocked ) {
return ! in_array( strtolower( $name ), $blocked, true );
}
)
);
}
add_filter( 'esw_svg_allowed_attributes', 'myplugin_strict_svg_attributes' );
Die Abfrage mit is_array() sorgt dafür, dass immer ein Array zurückkommt, auch wenn ein Callback vor deinem die Liste kaputt gemacht hat. Ein leeres Array lässt zwar nichts durch, entfernt aber jedes Attribut aus jeder Datei. Schreib in diesem Zweig also besser einen Logeintrag.
Der Sanitizer prüft nur den Wert von Attributen, deren Name href enthält: Dort erlaubt er Fragmente, relative Pfade, http(s) und ein paar data:-Bildtypen und entfernt javascript:. Jedes andere Attribut, das du ergänzt, behält den Wert, den die Datei mitbringt. Erlaubst du onload, onclick oder einen anderen on*-Namen, kann eine hochgeladene Datei Skripte im Browser jedes Betrachters ausführen, auch bei deinen Admins in der Mediathek. Ergänze nur Namen, die beschreiben, wie eine Grafik aussieht.
So funktioniert es
Der Filter läuft in esw_svg_attributes::getAttributes() (easy-svg.php, Zeile 91). Jeder Aufruf von easy_svg_sanitizer() baut einen neuen Sanitizer und ruft setAllowedAttrs( new esw_svg_attributes() ) auf. Das wendet den Filter an und schreibt das Ergebnis klein. Uploads, Sideloads, die Prüfung in wp_upload_bits, die Prüfung neuer Anhänge, die Icon-Bibliothek und Add-ons gehen alle über diese Funktion und sehen damit dieselbe Liste.
Zuerst werden die Elemente geprüft (siehe esw_svg_allowed_tags), Attribute nur an Elementen, die stehen bleiben. Gemischte Schreibweisen wie xlink:HrEf werden kleingeschrieben, wenn der kleine Name auf der Liste steht.
Für Icons gibt es einen festen Schritt mehr: easy_svg_harden_icon_markup() entfernt jedes on*-Attribut und jedes href, das nicht mit # beginnt, egal was diese Liste erlaubt, weil Icons direkt in Seiten eingebettet werden.
Stolperfallen
aria-*unddata-*kannst du hier nicht entfernen.aria-hiddenvon der Liste zu nehmen bewirkt nichts, die Bibliothek behält diese Präfixe immer.- Werte werden nicht geprüft. Nur Namen mit
hrefbekommen eine Wertprüfung. Ein neues Attribut behält jeden Wert, auchjavascript:. - Gib ein Array zurück.
nulloder ein String aus deinem Callback ist beim Upload ein fataler Fehler. - Beim Entfernen kleingeschrieben vergleichen. Die Standardliste enthält gemischte Schreibweisen wie
filterUnits. Nimmstrtolower()statt eines einfachenarray_diff(). - Präfixe gehören zum Namen.
xlink:titleundtitlesind zwei verschiedene Einträge. - Gängige Namen zu streichen zerstört Grafiken. Ohne
styleoderclassverlieren Dateien, die ihre Formen per CSS einfärben, ihre Farben. - Der XML-RPC-Weg lehnt ab, statt zu bereinigen. Dateien, die über
wp_upload_bits()geschrieben werden, werden abgelehnt, wenn der Sanitizer sie ändern würde. Eine strengere Liste bedeutet dort mehr abgelehnte Uploads. - Der alte globale Sanitizer ändert die Liste nicht.
setAllowedAttrs()am alten globalen$sanitizerwird an jeder Kopie überschrieben. Nimm den Filter.