Uploads und Grenzeneasy_svg_max_use_tags

easy_svg_max_use_tags

Lege fest, wie viele use-Elemente ein SVG enthalten darf, bevor Easy SVG es ablehnt. Gezählt wird in der rohen Datei, noch vor dem Sanitizer.

Filter · Easy SVG · Status: Stabil

Ein SVG kann eine Form mit use-Elementen beliebig oft wiederholen, jedes verweist über eine id auf ein anderes Element. Tausende davon machen das Bereinigen sehr langsam, auch bei einer kleinen Datei. Easy SVG zählt sie vorher und lehnt die Datei ab, wenn es mehr als 1000 sind. Mit diesem Filter änderst du diese Zahl.

Verwendung

apply_filters( 'easy_svg_max_use_tags', int $max )

Wird in easy-svg.php innerhalb von easy_svg_svg_too_complex() angewendet. Das Ergebnis wird in eine Ganzzahl umgewandelt.

Wann du es brauchst

  • Eine echte Zeichnung, die du brauchst, wird abgelehnt, zum Beispiel eine Karte oder ein Musterbogen, der ein Symbol einige Tausend Mal wiederholt, und du vertraust den Leuten, die sie hochladen.
  • Du willst strenger sein, etwa 200 auf einer Website, die nur Icons speichert.

Lass es bleiben, wenn:

  • die Datei wegen ihrer Größe abgelehnt wird. Dafür gibt es easy_svg_max_bytes.
  • der Sanitizer deine use-Verweise entfernt. Das liegt an der Erlaubt-Liste oder an den externen Verweisen, nicht an dieser Grenze.

Parameter

body
$maxint
Required

Die höchste Anzahl an use-Elementen, die eine Datei enthalten darf. Standard 1000. Im Icons-Bildschirm gibt es dafür keine Einstellung.

Rückgabewert

returnint

Die Grenze. Abgelehnt wird, wenn die Anzahl größer als diese Zahl ist: Mit 1000 kommt eine Datei mit genau 1000 durch, eine mit 1001 nicht. Gib 0 zurück, um jede Datei abzulehnen, die überhaupt ein use-Element enthält.

Standardwert

1000

Beispiele

Nur Icons, also eine viel kleinere Grenze

/**
 * Ein Icon braucht nie Hunderte use-Elemente.
 */
function mysite_svg_max_use_tags( $max ) {
	return 200;
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags' );

Eine höhere Grenze nur für Administratoren

/**
 * Detaillierte Karten vom Design-Team wiederholen eine Markierung ein paar Tausend Mal.
 */
function mysite_svg_max_use_tags_for_admins( $max ) {
	if ( current_user_can( 'manage_options' ) ) {
		return 5000;
	}

	return $max;
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags_for_admins' );

Anheben, aber nie über eine feste Obergrenze

function mysite_svg_max_use_tags_capped( $max ) {
	$wanted = defined( 'MYSITE_SVG_MAX_USE' ) ? (int) MYSITE_SVG_MAX_USE : (int) $max;

	return min( max( 0, $wanted ), 3000 );
}
add_filter( 'easy_svg_max_use_tags', 'mysite_svg_max_use_tags_capped' );

So funktioniert es

easy_svg_svg_too_complex() wandelt das rohe Markup in Kleinbuchstaben um und zählt, wie oft der Text <use vorkommt. Geparst wird nichts:

  • <use, <USE und <Use zählen alle.
  • Auch jedes Tag, das mit diesen Buchstaben anfängt, zählt mit, ebenso Text in Kommentaren und CDATA.
  • Ein Element mit Präfix wie <svg:use zählt nicht, weil dort :use steht und nicht <use.

Abgelehnt wird, wenn diese Anzahl größer ist als das Ergebnis des Filters oder wenn die Zahl der Verarbeitungsanweisungen größer ist als easy_svg_max_php_tags.

Warum es die Grenze gibt: Für jedes use-Element läuft der Sanitizer über jedes Element mit einer id, die Arbeit wächst also mit beiden Zahlen multipliziert. Zählen ist linear und billig und passiert vor dem teuren Teil.

Die Prüfung läuft nach der Größenprüfung und vor dem Sanitizer, auf denselben Wegen wie die anderen Grenzen: Mediathek- und REST-Uploads, Sideloads, das Sicherheitsnetz auf add_attachment (das einen durchgefallenen Anhang löscht), XML-RPC und wp_upload_bits() sowie jeder Weg in die Icon-Bibliothek. In der Mediathek zeigt eine abgelehnte Datei "Bitte überprüfe deine SVG-Datei.", in der Icon-Bibliothek "Dieses SVG hat zu viele Teile, um sicher gelesen zu werden." Der Filter läuft bei jeder Prüfung und bekommt keine Informationen über Datei oder Weg.

Stolperfallen

  • Hohe Werte kosten echte Zeit. Der Aufwand wächst mit der Zahl der use-Elemente mal der Zahl der Elemente mit id. Verdoppelst du die Grenze, kann der schlimmste Fall weit mehr als doppelt so teuer werden.
  • Die Zählung arbeitet auf Text. Kommentare und ungewöhnliche Tag-Namen, die mit use beginnen, können eine Datei über die Grenze schieben, während svg:use mit Präfix nicht gezählt wird.
  • Kein Kontext. Dein Callback kann ein Icon nicht von einem Mediathek-Upload unterscheiden. Brauchst du verschiedene Grenzen, entscheide nach Berechtigung oder Anfrage, nicht nach Datei.
  • Ein negativer Wert lehnt alles ab, weil eine Anzahl von 0 immer noch größer als -1 ist.
Diese Grenze gibt es, damit eine kleine, billig zu verschickende Datei keinen PHP-Worker minutenlang blockiert. Heb sie nur für Leute an, denen du vertraust, und nur so weit, wie deine Dateien es wirklich brauchen.

Siehe auch