Frontend-Sicherheit verstehen: Häufige Angriffe und ihre Abwehr, erklärt mit Animationen
Frontend-Sicherheit verstehen: Häufige Angriffe und ihre Abwehr, erklärt mit Animationen
Viele Frontend-Entwickler halten Sicherheit für „Sache des Backends”. In der Praxis passieren die meisten Angriffe aber im Browser: Ein bösartiges Skript läuft im Tab des Nutzers, der Browser schickt Cookies von sich aus mit, oder ein API-Schlüssel landet im Bundle und wird an jeden Besucher ausgeliefert.
Das hier sind meine Lernnotizen zur Frontend-Sicherheit. Ich habe die häufigsten Probleme als interaktive Animationen umgesetzt, und alle folgen derselben Struktur:
- Fünf Schritte: Schritt für Schritt sehen, wie der Angriff abläuft, mit einer „Hacker-Sicht” pro Schritt, die erklärt, was der Angreifer gerade denkt.
- Grundursache: warum das überhaupt möglich ist.
- Die richtige Lösung: Code, den man tatsächlich einsetzen kann.
Starte mit diesem kleinen Pixel-Abenteuer: „Abenteuer starten” spielt alle Stages von vorn bis hinten ab, oder du springst unten direkt zu einer Stage. Jede Stage verlinkt ihre ganze Animation. (Die ganzen Animationen sind auf traditionellem Chinesisch; dieser Beitrag behandelt dieselben Inhalte auf Deutsch.)
So liest du diesen Beitrag: Jedes Thema hat einen Angriffsablauf, der von selbst abspielt. Danach den Schalter „🛡 Abwehr an” umlegen und sehen, an welcher Stelle der Angriff gestoppt wird. Sieben Themen haben zusätzlich ein Labor zum Ausprobieren, am Ende warten eine interaktive Checkliste und ein Quiz.
Zuerst ein Denkmodell: vier Arten von Problemen
Diese Probleme wirken verstreut, lassen sich aber auf vier Grundursachen zurückführen. Wer diese vier kennt, kann auch neue Schwachstellen leichter einordnen.
| Kategorie | Kernidee | Themen |
|---|---|---|
| A. Injection und Ausführung | Der Browser kann „Daten” nicht von „Code” unterscheiden | 01 XSS, 03 Token-Speicherung, 14 CSP |
| B. Missbrauchtes Browser-Verhalten | Der Browser hängt „hilfsbereit” Cookies an, bettet Seiten ein und folgt Weiterleitungen | 02 CSRF, 11 CORS, 12 Clickjacking, 13 Open Redirect |
| C. Vertrauensgrenze an der falschen Stelle | Alles, was an den Browser geht, ist öffentlich, und jede Prüfung im Frontend lässt sich umgehen | 04 Autorisierung nur im Frontend, 07 Hartcodierte Secrets, 08 Console-Logs, 09 Source Maps |
| D. Lieferkette und Transport | Code, dem man vertraut, kann ausgetauscht werden, bevor er beim Nutzer ankommt | 05 Supply Chain, 06 CDN-SRI, 10 Mixed Content |
In einem Satz: Vertraue nichts, was vom Client kommt, und gib dem Client keine Geheimnisse.
A. Injection und Ausführung
01 XSS (Cross-Site Scripting)
Ein Kommentarfeld filtert die Eingabe nicht, und bösartiger Code läuft in den Browsern anderer Nutzer.
Grundursache: Der Server gibt Nutzereingaben unverändert als HTML aus, und der Browser kann „Inhalt” nicht von „Code” unterscheiden.
Die Lösung
function escapeHtml(str) {
return str.replace(/[&<>"']/g, (c) => ({
'&': '&', '<': '<', '>': '>', '"': '"', "'": ''',
}[c]));
}
res.send('<div>' + escapeHtml(comment) + '</div>');
Ergänzungen:
- Es gibt drei Arten von XSS: Stored (in der Datenbank gespeichert), Reflected (in einem URL-Parameter versteckt) und DOM-based (das Frontend-JS schreibt Daten selbst in
innerHTML). - React und Vue escapen
{value}-Bindings standardmäßig. Gefährlich sinddangerouslySetInnerHTML,v-html,innerHTMLund<a href={userInput}>(URLs, die mitjavascript:beginnen, werden trotzdem ausgeführt). - Wenn wirklich nutzergeneriertes HTML angezeigt werden muss (z. B. aus einem Rich-Text-Editor), mit einer Bibliothek wie DOMPurify bereinigen. Keine eigenen Regex schreiben.
03 Token-Speicherung: localStorage vs. httpOnly-Cookie
Dasselbe bösartige Skript, völlig unterschiedliche Ergebnisse, je nachdem wo der Token liegt.