Als Website-Betreiber oder Entwickler trägst du die Verantwortung, deine Nutzer und deine Anwendung vor potenziellen Sicherheitsrisiken zu schützen. SVG-Dateien sind ein weit verbreitetes Format für Vektorgrafiken und bieten viele Vorteile, wie Skalierbarkeit und Unterstützung für Interaktivität. Gleichzeitig bergen sie jedoch Gefahren, insbesondere durch Cross-Site-Scripting (XSS). Dies passiert, wenn Angreifer bösartige Skripte in SVG-Dateien einfügen, die dann auf deiner Website ausgeführt werden.
Hier sind die wichtigsten Maßnahmen aus der Sicht eines Website-Betreibers oder Programmierers, um SVG sicher in einer Webanwendung zu verwenden:
SVGs erlauben das Einfügen von JavaScript innerhalb der Datei, z. B. über <script>
-Tags oder Event-Handler wie onload. Dies kann von Angreifern ausgenutzt werden, um schädlichen Code auszuführen.
Was du tun kannst:
Beispiel für unsicheren Code:
<svg>
<circle cx="50" cy="50" r="40" onload="alert('XSS!')" />
</svg>
Lösung: Entferne alle Skripte oder eventbasierte Attribute aus SVG-Dateien.
<img src="example.svg" alt="Grafik">
Das <img>
-Tag isoliert die SVG-Datei vom DOM der Webseite. Eingebettete Skripte oder Event-Handler können in diesem Fall nicht ausgeführt werden.
Diese Methode eignet sich besonders für statische SVG-Grafiken, bei denen keine Interaktivität benötigt wird.
Eine Content Security Policy (CSP) schützt deine Website, indem sie kontrolliert, welche Skripte ausgeführt werden dürfen. Damit kannst du verhindern, dass bösartiges JavaScript aus SVG-Dateien ausgeführt wird.
Empfohlene CSP:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
script-src 'self';: Erlaubt nur Skripte von der eigenen Domain.
object-src 'none';: Verhindert das Einbinden von Objekten wie Flash oder gefährlichen Ressourcen.
Wenn du SVG-Dateien als <svg>
-Element einbindest, blockiert diese CSP jegliches Inline-JavaScript.
Dieser HTTP-Header verhindert, dass Browser versuchen, den MIME-Typ von Dateien zu "erraten". Ohne den Header könnte eine SVG-Datei mit schädlichem Code als HTML oder JavaScript interpretiert werden.
So richtest du den Header ein:
In NGINX - site.conf:
add_header X-Content-Type-Options "nosniff";
In Apache - .htaccess:
Header set X-Content-Type-Options "nosniff"
In IIS 7 - web.config:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
In PHP:
header('X-Content-Type-Options', 'nosniff');
In Python:
res.setHeader('X-Content-Type-Options', 'nosniff');
In Node.js (Express):
app.use((req, res, next) => {
res.setHeader('X-Content-Type-Options', 'nosniff');
next();
});
Dieser Header garantiert, dass SVG-Dateien nur als image/svg+xml
behandelt werden.
Wenn deine Anwendung SVG-Dateien akzeptiert (z. B. durch Nutzer-Uploads), besteht ein hohes Risiko, dass ein Angreifer bösartigen Code einschleust. Daher ist es essenziell, die Dateien zu bereinigen.
Tools für das Sanitizing:
Beispiel mit SVG Sanitize (Serverseitig):
use enshrined\svgSanitize\Sanitizer;
$sanitizer = new Sanitizer();
$dirtySVG = file_get_contents('file.svg');
$cleanSVG = $sanitizer->sanitize($dirtySVG);
Beispiel mit DOMPurify (Clientseitig):
import DOMPurify from 'dompurify';
const unsicheresSvg = `<svg><circle cx="50" cy="50" r="40" onload="alert('XSS!')"/></svg>`;
const sicheresSvg = DOMPurify.sanitize(unsicheresSvg);
document.getElementById('svgContainer').innerHTML = sicheresSvg;
Beispiel mit SVGO (Serverseitig):
const SVGO = require('svgo');
const svgo = new SVGO();
svgo.optimize('file.svg').then(result => {
console.log(result.data); // Optimierte und sichere SVG-Datei
});
SVG-Dateien sollten nur aus sicheren und vertrauenswürdigen Quellen stammen. Falls deine Website SVG-Uploads von Nutzern erlaubt:
Als Website-Betreiber oder Entwickler kannst du SVG-Dateien sicher einbinden, indem du folgende Best Practices einhältst:
<img>
laden: Isoliere SVGs vom DOM, um Skriptausführung zu verhindern.Durch die Kombination dieser Maßnahmen kannst du SVGs sicher verwenden und deine Website vor XSS-Angriffen schützen. Sicherheit sollte immer oberste Priorität haben, besonders bei Dateien, die von Nutzern bereitgestellt werden oder potenziell dynamische Inhalte enthalten.