easy_svg_max_php_tags
Lege fest, wie viele Verarbeitungsanweisungen (inklusive XML-Deklaration) ein SVG enthalten darf, bevor Easy SVG es ungelesen ablehnt.
Filter · Easy SVG · Status: Stabil
Manche SVG-Dateien sind klein, aber so gebaut, dass das Bereinigen extrem lange dauert. Ein Trick dafür sind viele gestapelte Verarbeitungsanweisungen, also Schnipsel, die mit einem Kleiner-als-Zeichen und einem Fragezeichen beginnen, wie die Zeile <?xml ... ?> am Anfang einer Datei. Easy SVG zählt sie vor dem Bereinigen und lehnt die Datei ab, wenn es zu viele sind. Dieser Filter legt die Zahl fest.
Verwendung
apply_filters( 'easy_svg_max_php_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
- Du willst strenger sein als der Standard von 10, zum Beispiel 2 auf einer Website, auf der alle SVGs aus demselben Export-Tool kommen und höchstens eine XML-Deklaration haben.
- Eine echte Datei aus einem speziellen Tool wird abgelehnt, und du hast geprüft, dass sie wirklich mehr als 10 Verarbeitungsanweisungen enthält. Das ist sehr selten.
Lass es bleiben, wenn:
- eine Datei wegen ihrer Größe abgelehnt wird. Dafür ist
easy_svg_max_bytesda. - eine Datei abgelehnt wird, weil der Sanitizer sie nicht lesen kann (kaputtes XML, eigene DTD-Entities). Eine höhere Zahl hilft da nicht.
Parameter
Die höchste Anzahl an Verarbeitungsanweisungen, die eine Datei enthalten darf. Standard 10. Im Icons-Bildschirm gibt es dafür keine Einstellung, der eingehende Wert ist also immer 10, solange kein anderer Filter ihn vorher geändert hat.
Rückgabewert
Die Grenze. Abgelehnt wird eine Datei, deren Anzahl größer als diese Zahl ist. Mit 10 kommt eine Datei mit genau 10 also noch durch. Gib 1 oder mehr zurück, wenn du Dateien mit XML-Deklaration annimmst (das sind die meisten exportierten SVGs).
Standardwert
10
Beispiele
Strenger als der Standard
/**
* Die XML-Deklaration und eine weitere Verarbeitungsanweisung erlauben, mehr nicht.
*/
function mysite_svg_max_php_tags( $max ) {
return 2;
}
add_filter( 'easy_svg_max_php_tags', 'mysite_svg_max_php_tags' );
Nie unter eins
Kommt die Zahl aus einer Quelle, die du nicht kontrollierst (eine Option, eine Konstante), halte sie bei 1 oder mehr. Sonst wird jede Datei mit XML-Deklaration abgelehnt.
function mysite_svg_max_php_tags_from_option( $max ) {
$wanted = (int) get_option( 'mysite_svg_max_pi', $max );
return max( 1, $wanted );
}
add_filter( 'easy_svg_max_php_tags', 'mysite_svg_max_php_tags_from_option' );
Nur verschärfen, nie lockern
Ein Website-Plugin, das den Standard nie schwächen soll:
function mysite_svg_max_php_tags_cap( $max ) {
return min( (int) $max, 5 );
}
add_filter( 'easy_svg_max_php_tags', 'mysite_svg_max_php_tags_cap', 20 );
So funktioniert es
easy_svg_svg_too_complex() zählt reinen Text, ganz ohne Parsen:
- Gezählt wird jedes Vorkommen der beiden Zeichen Kleiner-als und Fragezeichen in den rohen Bytes.
- Dazu gehören die XML-Deklaration
<?xml version="1.0"?>, eine Stylesheet-Anweisung<?xml-stylesheet ... ?>, PHP-Tags und dieselben Zeichen in Kommentaren oder CDATA. Es wird nichts geparst, die Zählung weiß also nicht, wo sie gerade ist. - Abgelehnt wird, wenn die Anzahl größer ist als das Ergebnis dieses Filters oder wenn die
use-Anzahl größer ist alseasy_svg_max_use_tags.
Warum überhaupt gezählt wird: Die Bereinigungs-Bibliothek durchsucht das ganze Dokument pro verschachtelter Verarbeitungsanweisung erneut, die Arbeit wächst also viel schneller als die Datei. Zählen ist billig und braucht nur einen Durchlauf.
Die Prüfung läuft auf jedem Weg, auf dem ein SVG hereinkommt, immer nach der Größenprüfung und vor dem Sanitizer:
- Mediathek-Uploads, REST-Medien-Uploads und Sideloads (
wp_handle_upload_prefilter,wp_handle_sideload_prefilter) - das Sicherheitsnetz für neue Anhänge (
add_attachment), das den Anhang löscht, wenn die Prüfung scheitert - XML-RPC und
wp_upload_bits() - jeder Weg in die Icon-Bibliothek: hinzufügen, aus der Mediathek übernehmen, ersetzen
Was die Leute sehen, wenn sie scheitert: "Bitte überprüfe deine SVG-Datei." in der Mediathek, die XML-RPC-Meldung bei wp_upload_bits() und "Dieses SVG hat zu viele Teile, um sicher gelesen zu werden." beim Hinzufügen zur Icon-Bibliothek (beim Ersetzen eines Icons nur "Diese Datei ist kein SVG, das diese Bibliothek verwenden kann.").
Der Filter läuft bei jeder Prüfung, ohne Cache und ohne Kontext. Dein Callback kann ein Icon nicht von einem Upload unterscheiden.
Stolperfallen
- Die XML-Deklaration zählt mit.
return 0;lehnt jedes SVG ab, das mit<?xmlbeginnt, und das sind die meisten Dateien aus Design-Tools. - Eine negative Zahl lehnt alles ab. Geprüft wird "Anzahl größer als Grenze", und 0 ist größer als -1. Selbst eine Datei ganz ohne Verarbeitungsanweisung fliegt dann raus.
- Höher kostet Zeit. Jede weitere verschachtelte Anweisung lässt eine einzelne Datei einen PHP-Worker länger blockieren. Keine echte Zeichnung braucht mehr als eine Handvoll.
- Der Name sagt PHP, die Zählung nicht. Gezählt wird jede Verarbeitungsanweisung, nicht nur PHP.