Web Security

Web Security

Sicherheit ist kein Feature, das man am Ende hinzufügt. XSS, CSRF, CORS und eine sichere Authentifizierung bilden die Basis, die jeder Webentwickler verstehen muss.

intermediate15 min readUpdated 15. Sept. 2026
comment.js
js
// comment.js
function renderComment(text) {
  const el = document.createElement("p");
  // textContent escapes markup, so
  // <script> is shown as text, not run
  el.textContent = text;
  return el;
}
Goldene Regel
Vertraue niemals dem Client
Top-Risiko
Cross-site scripting
Transport
HTTPS überall
Sessions
HttpOnly, Secure Cookies
Defence in Depth
Encoden, Validieren, Restriktieren
Referenz
OWASP Top 10

Warum es wichtig ist

Warum Sicherheit die Aufgabe aller ist

Schütze deine Nutzer

Ein einziger XSS-Bug kann Accounts, Daten und Geld gefährden. Sicherheitslücken sind die teuersten Bugs, die man ausliefern kann.

Schütze die Session

Cookies, Tokens und CSRF-Schutz entscheiden darüber, ob ein Angreifer als dein Nutzer agieren kann.

Schütze die Daten

Passwort-Hashing, Input-Validierung und das Prinzip der geringsten Berechtigung halten Datenlecks im Zaum.

Das Gesamtbild

Die drei Fronten der Web Security

Vertraue nichts vom Client, schütze die Session und konfiguriere die Browser-Abwehrmechanismen korrekt.

Nicht vertrauenswürdiger Input

Gehe vom Worst Case aus

Alles vom Client kann gefälscht sein, daher musst du auf dem Server validieren und encoden.

Der Browser

Erzwingen

Header wie CSP, HSTS und Cookie-Flags ermöglichen es dem Browser, deine Regeln durchzusetzen.

Der Server

Entscheiden

Authentifizierung, Autorisierung und Datenzugriff gehören auf den Server, niemals auf den Client.

Security im Überblick

Bedrohungen und Abwehrmaßnahmen

XSS

Injizierte Scripte laufen auf deiner Seite. Verhindere dies durch Output Encoding.

CSRF

Gefälschte Anfragen, die die Cookies des Opfers nutzen. Verhindere dies mit Tokens und SameSite.

CORS

Eine Browser-Regel darüber, welche Origins Antworten lesen dürfen.

Authentication

Sessions, Tokens, Hashing und Multi-Faktor-Authentifizierung.

HTTPS

Verschlüssele den Traffic und aktiviere HSTS.

CSP

Beschränke, welche Scripte, Styles und Verbindungen eine Seite nutzen darf.

Eine kurze Geschichte

Wie das Web lernte, sich zu verteidigen

  1. 2005

    XSS wird Mainstream

    Cross-site scripting wird zu einer der am häufigsten gemeldeten Web-Schwachstellen.

    05
  2. 2008

    Same-origin policy wird verschärft

    Browser verschärfen die Regeln für Cross-Origin-Reads und den Cookie-Zugriff.

    08
  3. 2012

    Content Security Policy

    CSP gibt Seiten eine Möglichkeit zu deklarieren, welchen Quellen der Browser vertrauen soll.

    12
  4. 2014

    HTTPS überall

    Let's Encrypt und HSTS treiben das Web in Richtung universeller Verschlüsselung.

    14
  5. Heute

    Secure by Default

    Moderne Frameworks und Plattformen liefern sicherere Defaults aus, aber Entwickler müssen diese dennoch konfigurieren.

    Heute

Der vollständige Leitfaden

Web Security: Alles was Sie wissen müssen

Warum Sicherheit die Aufgabe aller ist

Web-Sicherheit ist kein Spezialgebiet, das von jemand anderem erledigt wird. Jedes Formular, jeder gerenderte Kommentar, jedes Cookie und jeder API-Endpunkt bietet die Chance für einen Fehler, der Ihre Nutzer gefährdet. Die Kosten eines Sicherheitsfehlers sind ungewöhnlich hoch: Datenverlust, zerstörtes Vertrauen und rechtliche Konsequenzen.

Die gute Nachricht ist, dass die meisten Angriffe nur wenigen Mustern folgen und die meisten Abwehrmaßnahmen gut verstanden sind. Dieser Guide deckt die Grundlagen ab: Cross-Site Scripting, Cross-Site Request Forgery, CORS, sichere Authentifizierung und die Browser-Header, mit denen Sie Ihre Regeln durchsetzen.

Die goldene Regel

Vertraue niemals dem Client. Alles, was vom Browser kommt, kann gefälscht sein: Formularwerte, Header, versteckte Felder, Preise, User-IDs und der JavaScript-State. Clientseitige Validierung dient der User Experience; der Server muss alles erneut validieren und autorisieren.

Dieses eine Prinzip ist die Grundlage fast jeder Sicherheitsmaßnahme. Wenn du davon ausgehst, dass Inputs bösartig sind und Berechtigungen serverseitig geprüft werden müssen, verschwinden die meisten Schwachstellen, noch bevor sie programmiert werden.

Cross-site scripting (XSS)

XSS ist die am häufigsten vorkommende schwerwiegende Web-Schwachstelle. Sie tritt auf, wenn vom Angreifer kontrollierte Daten als Code behandelt werden. Es gibt drei Hauptarten: stored (auf dem Server gespeichert und an andere ausgeliefert), reflected (in einer Antwort zurückgegeben) und DOM-based (durch clientseitiges JavaScript eingeführt).

Die primäre Verteidigungsmaßnahme ist das Output Encoding: Kodieren Sie Daten für den Kontext, in dem sie erscheinen. Verwenden Sie im DOM textContent anstelle von innerHTML.

// safe.js
const el = document.createElement("p");
el.textContent = userComment; // escaped

// If you truly need HTML, sanitise it
import DOMPurify from "dompurify";
el.innerHTML = DOMPurify.sanitize(userHtml);

Verwenden Sie auf dem Server Templating, das standardmäßig escaped, und erstellen Sie SQL oder HTML niemals durch String-Konkatenation. Verwenden Sie für Datenbanken immer parametrisierte Queries oder ein ORM, damit Eingaben niemals zu SQL werden können.

Content Security Policy

Eine Content Security Policy ist ein Response-Header, der dem Browser mitteilt, welche Quellen eine Seite verwenden darf. Eine strikte Policy verwandelt viele XSS-Bugs in harmlose Konsolenfehler.

Content-Security-Policy:
  default-src 'self';
  script-src 'self';
  object-src 'none';
  base-uri 'self';
  frame-ancestors 'none';

Beginnen Sie mit Content-Security-Policy-Report-Only, um Verstöße zu erfassen, ohne die Seite funktionsunfähig zu machen, und stellen Sie die Policy erst danach verbindlich ein. Vermeiden Sie unsafe-inline und unsafe-eval, wo immer es möglich ist, und verwenden Sie Nonces oder Hashes für Inline-Scripts, die Sie nicht entfernen können.

Cross-site request forgery (CSRF)

CSRF täuscht den Browser dazu, eine authentifizierte Anfrage unter Verwendung der Cookies des Opfers zu senden. Wenn Ihre Seite cookie-basierte Sessions nutzt und ein zustandsändernder Endpoint einfache Anfragen akzeptiert, kann eine Seite eines Angreifers diese auslösen.

Abwehrmaßnahmen, in Schichten:

  • SameSite cookies. SameSite=Lax oder Strict verhindert in modernen Browsern, dass Cookies bei Cross-Site-Anfragen gesendet werden.
  • Anti-CSRF tokens. Ein pro Session generierter Token, der in Formularen enthalten und auf dem Server verifiziert wird.
  • Origin prüfen. Lehnen Sie zustandsändernde Anfragen ab, deren Origin Header nicht Ihre eigene Seite ist.
  • Niemals Mutationen via GET. Verwenden Sie POST, PUT, PATCH oder DELETE für Änderungen.

CORS

CORS ist eine Browser-Regel, die festlegt, welche Origins Antworten Ihrer API lesen dürfen. Standardmäßig kann eine Seite keine Cross-Origin-Antwort lesen, es sei denn, der Server erlaubt dies über Access-Control-Allow-Origin.

Zwei Dinge werden häufig missverstanden:

  • CORS schützt den Browser des Nutzers, nicht Ihren Server. Andere Server können Ihre API ungehindert aufrufen; nur eine serverseitige Autorisierung kann dies verhindern.
  • Ein permissives Access-Control-Allow-Origin: * in Kombination mit Credentials ist nicht zulässig, und das Spiegeln beliebiger Origins ist gefährlich.

Konfigurieren Sie CORS explizit für die Origins, denen Sie vertrauen, und behalten Sie die Authentifizierung und Autorisierung auf dem Server.

Sichere Authentifizierung

Bei der Authentifizierung sind Fehler am kostspieligsten.

  • Passwörter hashen mit bcrypt, scrypt oder Argon2; niemals im Klartext oder mittels reversibler Verschlüsselung speichern.
  • HttpOnly, Secure und SameSite Cookies für Sessions verwenden, damit JavaScript den Token nicht auslesen kann.
  • Kurzlebige Tokens mit Refresh-Mechanismus bevorzugen und diese rotieren.
  • Multi-Faktor-Authentifizierung für sensible Accounts implementieren.
  • Login-Versuche rate-limitieren und nach wiederholten Fehlversuchen sperren.
  • Geheimnisse niemals im Client-Code hinterlegen — alles, was an den Browser gesendet wird, ist öffentlich.

Der obige Vergleich zeigt den Trade-off zwischen Cookies und localStorage. localStorage Tokens sind zwar praktisch, aber durch jedes Skript lesbar, sodass ein einziger XSS-Angriff die Session stehlen kann. HttpOnly Cookies schließen diesen Weg aus.

Weitere Essentials

  • Überall HTTPS, inklusive HSTS, um Downgrade-Angriffe zu verhindern.
  • Input-Validierung und Encoding auf dem Server für jedes einzelne Feld.
  • Prinzip der geringsten Berechtigung (Least Privilege) für Datenbank-Benutzer, API keys und Cloud-Rollen anwenden.
  • Security Header setzen: CSP, HSTS, X-Content-Type-Options: nosniff, Referrer-Policy und frame-ancestors.
  • Dependencies aktuell halten und regelmäßig auditieren.
  • Keine Details preisgeben in Fehlermeldungen oder Stack Traces in der Production-Umgebung.
  • Authentifizierungs-Events und Berechtigungsfehler loggen und überwachen.

Best Practices

  • Behandle alle Client-Inputs als nicht vertrauenswürdig und validiere sie auf dem Server.
  • Kodiere die Ausgabe entsprechend ihrem Kontext; verwende textContent und bereinige jegliches HTML.
  • Nutze für jeden Datenbankzugriff parametrisierte Queries.
  • Speichere Sessions in HttpOnly, Secure und SameSite Cookies.
  • Implementiere eine Content Security Policy und starte zunächst im Report-Only-Modus.
  • Verwende SameSite zusammen mit Anti-CSRF-Tokens für zustandsändernde Requests.
  • Bewahre Secrets auf dem Server auf und rotiere diese regelmäßig.

Häufige Fehler

  • Verwendung von innerHTML mit Benutzerdaten.
  • Speichern von Session-Tokens in localStorage.
  • Vertrauen auf clientseitige Validierung oder versteckte Formularfelder.
  • Erstellung von SQL-Abfragen mittels String-Konkatenation.
  • Die Annahme, dass CORS ein Mechanismus zur Zugriffskontrolle ist.
  • Ausliefern von API-Keys im Front-End-Code.

Wie geht es weiter?

Sicherheit ist ein fortlaufender Prozess und keine Checkliste, die man einfach abhakt. Verankern Sie Ihre Sicherheitsmaßnahmen im HTTP-Protokoll, setzen Sie diese auf dem Node.js-Server durch und gehen Sie sicher mit Secrets um, wenn Sie Ihre Anwendung mit Docker bereitstellen. Lesen Sie die OWASP Top 10 und prüfen Sie anschließend ein Formular in Ihrer eigenen App von Anfang bis Ende – fast immer wird man etwas finden, das es zu verbessern gilt.

Rendering von Nutzerinhalten

textContent behandelt Input als Text. innerHTML parst ihn als Markup, was jeden Nutzer-Input in eine potenzielle Script-Injection verwandelt.

Bevorzugt
const el = document.createElement("p");
el.textContent = comment;
// <b>hi</b> renders literally
Vermeiden
el.innerHTML = comment;
// <img src=x onerror=alert(1)>
// executes

Speichern von Session-Tokens

Ein HttpOnly, Secure, SameSite Cookie ist nicht durch JavaScript lesbar, sodass ein XSS-Bug die Session nicht stehlen kann.

Bevorzugt
res.cookie("session", token, {
  httpOnly: true,
  secure: true,
  sameSite: "lax",
  maxAge: 1000 * 60 * 60,
});
Vermeiden
localStorage.setItem("token", token);
// readable by any script,
// stolen by any XSS

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, Web Security zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch Web Security — mit Quizzen und echtem Code, den Sie im Browser ausführen können.