Bereinigungesw_svg_allowed_attributes

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-origin oder mask-type, und die Grafik sieht nach dem Upload anders aus.
  • Du brauchst ein Barrierefreiheits-Attribut, das die eingebaute aria-*-Regel nicht abdeckt, zum Beispiel focusable.
  • Deine Site soll strenger sein als der Standard und reine HTML-Attribute wie src oder srcset aus jedem SVG entfernen.

Lass es bleiben:

  • Für Event-Handler. Nichts, was mit on beginnt, gehört auf diese Liste.
  • Um aria-*- oder data-*-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

body
$attributesstring[]
Required

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

returnstring[]

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:lang und Editor-Namespaces wie inkscape:* und sodipodi:*.
  • Immer behalten, unabhängig von der Liste: jeder Name, der mit aria- oder data- 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-* und data-* kannst du hier nicht entfernen. aria-hidden von der Liste zu nehmen bewirkt nichts, die Bibliothek behält diese Präfixe immer.
  • Werte werden nicht geprüft. Nur Namen mit href bekommen eine Wertprüfung. Ein neues Attribut behält jeden Wert, auch javascript:.
  • Gib ein Array zurück. null oder ein String aus deinem Callback ist beim Upload ein fataler Fehler.
  • Beim Entfernen kleingeschrieben vergleichen. Die Standardliste enthält gemischte Schreibweisen wie filterUnits. Nimm strtolower() statt eines einfachen array_diff().
  • Präfixe gehören zum Namen. xlink:title und title sind zwei verschiedene Einträge.
  • Gängige Namen zu streichen zerstört Grafiken. Ohne style oder class verlieren 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 $sanitizer wird an jeder Kopie überschrieben. Nimm den Filter.

Siehe auch