Daten-URLs in SVG-Elementen migrieren

Jun Kokatsu
Jun Kokatsu

Die SVG-Spezifikation wurde vor Kurzem aktualisiert, um die Unterstützung für data:-URLs im SVG-Element <use> einzustellen. Hierdurch wird die Sicherheit der Webplattform und die Kompatibilität zwischen Browsern verbessert, da Webkit keine data:-URLs im SVG-Element <use> unterstützt.

Grund für die Entfernung

Mit dem SVG-Element <use> können externe SVG-Bilder abgerufen und in das aktuelle Dokument geklont werden. Da es sich um eine leistungsstarke Funktion handelt, ist sie auf SVG-Bilder mit demselben Ursprung beschränkt. data:-URLs werden jedoch als Ressourcen mit demselben Ursprung behandelt, die mehrere Sicherheitslücken verursachen, z. B. die Umgehung von vertrauenswürdigen Typen und der Sanitizer API. Diese Sicherheitslücken führten zu einer Diskussion darüber, wie sie am besten behoben werden können. Wir haben uns unter den Browseranbietern (Mozilla und Apple) darauf geeinigt, dass die Unterstützung für data:-URLs im SVG-Element <use> am besten eingestellt wird.

Für Websites, die data:-URLs im SVG-<use>-Element verwenden, gibt es mehrere Alternativen.

SVG-Bilder mit demselben Ursprung verwenden

Sie können SVG-Bilder am selben Ursprung mit dem Element <use> laden.

<div class="icon">
  <svg width="1em" height="1em">
    <use xlink:href="svgicons.svg#user-icon"></use>
  </svg>
</div>

Inline-SVG-Bilder verwenden

Sie können mit dem <use>-Element auf Inline-SVG-Bilder verweisen.

<svg style="display:none" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <symbol id="user-icon" viewBox="0 0 32 32">
      <path d="M25.333 9.335c0 5.153-4.179 9.333-9.333 9.333s-9.333-4.18-9.333-9.333c0-5.156 4.179-9.335 9.333-9.335s9.333 4.179 9.333 9.335zM23.203 18.908c-2.008 1.516-4.499 2.427-7.203 2.427-2.707 0-5.199-0.913-7.209-2.429-5.429 2.391-8.791 9.835-8.791 13.095h32c0-3.231-3.467-10.675-8.797-13.092z">
    </symbol>
    <!-- And potentially many more icons -->
  </defs>
</svg>

<div class="icon">
  <svg width="1em" height="1em">
    <use xlink:href="#user-icon"></use>
  </svg>
</div>

SVG-Bilder mit blob:-URLs verwenden

Wenn Sie keine Kontrolle über die HTML- oder Ressourcen desselben Ursprungs einer Seite haben (z. B. JavaScript-Bibliotheken), können Sie SVG-Bilder mit blob:-URLs im <use>-Element laden.

const svg_content = `<svg style="display:none" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
      <symbol id="user-icon" viewBox="0 0 32 32">
        <path d="M25.333 9.335c0 5.153-4.179 9.333-9.333 9.333s-9.333-4.18-9.333-9.333c0-5.156 4.179-9.335 9.333-9.335s9.333 4.179 9.333 9.335zM23.203 18.908c-2.008 1.516-4.499 2.427-7.203 2.427-2.707 0-5.199-0.913-7.209-2.429-5.429 2.391-8.791 9.835-8.791 13.095h32c0-3.231-3.467-10.675-8.797-13.092z">
      </symbol>
      <!-- And potentially many more icons -->
    </defs>
  </svg>`;
const blob = new Blob([svg_content], {type: 'image/svg+xml'});
const url = URL.createObjectURL(blob);
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
use.setAttribute('href', url + '#user-icon');
svg.appendChild(use);
document.body.appendChild(svg);

Live-Beispiele

Live-Beispiele für diese Alternativen finden Sie auf GitHub.