Bereinigungesw_svg_remove_remote_references

esw_svg_remove_remote_references

Entscheidet, ob Easy SVG absolute URLs, fremdes CSS und @import aus SVGs entfernt. Standardmäßig an, damit eine Datei nichts von anderswo nachlädt.

Filter · Easy SVG · Status: Stabil

Ein SVG kann Dinge von anderen Servern nachladen: ein Bild, ein Stylesheet, eine Schrift. Der Browser jedes Besuchers fragt dann diesen Server an, und der kann protokollieren, wer sich deine Seite angesehen hat. Easy SVG entfernt solche Verweise standardmäßig. Mit diesem Filter schaltest du das ab, oder du stellst sicher, dass es eingeschaltet bleibt.

Verwendung

apply_filters( 'esw_svg_remove_remote_references', bool $remove )
add_filter( 'esw_svg_remove_remote_references', '__return_false' );

Wann du es brauchst

  • Deine SVGs sind Infografiken mit klickbaren Links (a href="https://..."). Mit dem Standard verlieren diese Links beim Upload ihr href.
  • Ein vertrauenswürdiger Import, zum Beispiel ein Umzug von einer anderen Site, bringt SVGs mit, die eine Webschrift oder ein Bild von einem CDN laden, und du willst sie so speichern, wie sie sind.
  • Du betreibst eine gehärtete Site und willst garantieren, dass kein anderes Plugin das Entfernen abschaltet. Gib spät true zurück.

Lass es bleiben:

  • Nur weil eine einzelne Datei falsch aussieht. Bette Bild oder Schrift in die Datei ein (oder lade sie als eigene Mediendatei hoch), statt jeden Upload für fremde Quellen zu öffnen.
  • Um zu ändern, was die Icon-Bibliothek behält. Icons verlieren jedes href, das nicht mit # beginnt, egal was dieser Filter sagt.

Parameter

body
$removebool
Required

true (Standard) entfernt fremde Verweise, false behält sie. Der Rückgabewert wird in bool umgewandelt, 0, '' und null zählen also als false.

Rückgabewert

returnbool

true entfernt fremde Verweise aus jedem SVG, das ab jetzt bereinigt wird, false behält sie.

Standardwert

true. Eingeführt mit Easy SVG 5.0.0, bis 4.1 blieben fremde Verweise erhalten. Die mitgelieferte Bibliothek selbst steht standardmäßig auf false, deshalb setzt das Plugin den Wert immer ausdrücklich.

Was true entfernt:

WoWas passiert
Jedes Attribut, dessen Wert eine absolute URL ist (http:, https:, ftp:, file:) oder protokollrelativ (//host/...)Das ganze Attribut fällt weg. Das gilt auch für href an a und image.
Jedes Attribut mit einem fremden url(...) oder @importDas ganze Attribut fällt weg.
Ein style-Attribut mit einem fremden Verweis hinter CSS-Escapes, Kommentaren oder in image-set()Das ganze Attribut fällt weg.
Text in einem style-ElementFremde url(...)- und image-set(...)-Angaben werden herausgeschnitten, und jede @import-Regel wird entfernt, auch lokale. Das restliche CSS bleibt.

Was bleibt: Fragment-Verweise (#gradient, url(#clip)), Pfade ab der Wurzel (/wp-content/uploads/a.png), relative Pfade in CSS (url(images/a.png)) und die data:image/png-, gif- und jpeg-URIs, die die href-Prüfung akzeptiert. Ein relatives href wie images/a.png fällt in jedem Fall weg: Die eigene href-Prüfung, die dieser Filter nicht steuert, lässt nur Fragmente, Pfade mit / am Anfang, http(s) und diese data:-Typen zu.

Beispiele

Fremde Verweise überall behalten

// Links und fremde Bilder in hochgeladenen SVGs bleiben ab jetzt erhalten.
add_filter( 'esw_svg_remove_remote_references', '__return_false' );

Nur während eines vertrauenswürdigen Imports behalten

Der Wert wird jedes Mal gelesen, wenn ein Sanitizer gebaut wird. Du kannst ihn also für einen Job abschalten und danach wieder einschalten.

/**
 * SVGs aus einem vertrauenswürdigen Ordner importieren, fremde Verweise behalten.
 *
 * @param string[] $paths Absolute Pfade der SVG-Dateien.
 * @return int[] IDs der neuen Anhänge.
 */
function myplugin_import_trusted_svgs( array $paths ) {
	require_once ABSPATH . 'wp-admin/includes/file.php';
	require_once ABSPATH . 'wp-admin/includes/media.php';
	require_once ABSPATH . 'wp-admin/includes/image.php';

	$ids = array();

	add_filter( 'esw_svg_remove_remote_references', '__return_false' );

	try {
		foreach ( $paths as $path ) {
			$tmp = wp_tempnam( basename( $path ) );
			if ( ! $tmp || ! copy( $path, $tmp ) ) {
				continue;
			}

			$id = media_handle_sideload(
				array(
					'name'     => basename( $path ),
					'tmp_name' => $tmp,
				),
				0
			);

			if ( is_wp_error( $id ) ) {
				wp_delete_file( $tmp );
				continue;
			}

			$ids[] = $id;
		}
	} finally {
		remove_filter( 'esw_svg_remove_remote_references', '__return_false' );
	}

	return $ids;
}

media_handle_sideload() durchläuft dieselbe Prüfung wie der Uploader (wp_handle_sideload_prefilter), direkt danach folgt die Prüfung des neuen Anhangs. Beide bauen ihren Sanitizer, während dein Filter aktiv ist, und behalten deshalb die Verweise. Der finally-Block sorgt dafür, dass eine fehlerhafte Datei den Filter nicht für den Rest der Anfrage eingeschaltet lässt.

Sicherstellen, dass niemand es abschaltet

/**
 * Fremde Verweise immer entfernen, egal was andere Plugins zurückgeben.
 */
function myplugin_force_remote_reference_removal() {
	add_filter( 'esw_svg_remove_remote_references', '__return_true', PHP_INT_MAX );
}
add_action( 'plugins_loaded', 'myplugin_force_remote_reference_removal' );

Strenger nur für dein Add-on

easy_svg_sanitizer() liefert bei jedem Aufruf eine neue Instanz. Ein Add-on kann seine eigene Kopie also verschärfen, ohne die Einstellung der Site anzufassen.

$sanitizer = function_exists( 'easy_svg_sanitizer' ) ? easy_svg_sanitizer() : null;

if ( null !== $sanitizer ) {
	// Unsere eigenen Inhalte brauchen nie fremde Verweise, egal was die Site erlaubt.
	$sanitizer->removeRemoteReferences( true );
}

Mit false kann ein hochgeladenes SVG den Browser jedes Besuchers, und jedes Admins, der die Mediathek öffnet, dazu bringen, eine URL auf einem Server abzurufen, den du nicht kontrollierst. Dieser Server erfährt IP-Adressen, Browser und welche Seite angesehen wurde, und kann jederzeit ändern, was er ausliefert. Schalte das nur ab, wenn du jedem vertraust, der SVGs hochladen darf.

So funktioniert es

easy_svg_sanitizer() wendet den Filter bei jedem Aufruf an (easy-svg.php, Zeile 294) und übergibt das Ergebnis an removeRemoteReferences() der Bibliothek:

Weil der Filter erst nach dem Klonen des alten globalen Sanitizers angewendet wird, gewinnt er immer. Ein Snippet aus 4.x-Zeiten, das am globalen Objekt $sanitizer->removeRemoteReferences( false ) aufruft, bewirkt nichts mehr. Die Bibliothek kann ein bewusstes false nicht von ihrem eigenen Standard unterscheiden, deshalb entscheidet das Plugin allein über den Filter.

Jeder Weg, der SVG bereinigt, ruft easy_svg_sanitizer() auf: Uploads und Sideloads in die Mediathek, die Prüfung in wp_upload_bits für XML-RPC, die Prüfung jedes neuen Anhangs, die Icon-Bibliothek und Add-ons. Auf dem Weg über wp_upload_bits wird eine Datei abgelehnt statt bereinigt. Mit dem Standard scheitert dort also jede Datei, die einen fremden Verweis enthält.

Stolperfallen

  • Deine eigene Domain zählt als fremd. Geprüft wird die Form der URL, nicht der Host. https://deine-site.example/wp-content/uploads/a.png fällt genauso weg wie eine fremde URL. Nimm Pfade ab der Wurzel (/wp-content/...), wenn eine Datei auf deine eigenen Medien verweisen muss.
  • Links verlieren ihr Ziel. a href="https://..." behält das a-Element und seinen Inhalt, aber nicht das href. Der Link ist tot.
  • Auch lokales @import fällt weg. In einem style-Element wird jede @import-Regel entfernt, nicht nur fremde.
  • Alte Dateien werden nicht neu geprüft. Eine Änderung am Filter wirkt auf Dateien, die danach bereinigt werden. Was schon gespeichert ist, bleibt, wie es ist.
  • Der alte globale Sanitizer wird für diese Einstellung ignoriert. Steuere sie nur über den Filter.
  • Icons behalten so oder so kein externes href. Die Icon-Härtung entfernt nach dem Bereinigen jedes href, das nicht mit # beginnt.

Siehe auch