Sicherheit im Web einfach erklärt | Vollständiger Leitfaden
Web-Entwicklung Grundlagen

Sicherheit im Web

Webseiten, Benutzerkonten und Daten mit mehreren Schutzschichten absichern – verständlich erklärt, mit sicheren Codebeispielen und einer Praxis-Checkliste.

OWASP Top 10:2025 Für Einsteiger Sicher entwickeln WordPress-Praxis

🛠️ Empfohlene Tools für Entwickler

Diese Tools nutze ich selbst – sie helfen Ihnen, Ihre Projekte professionell umzusetzen und zu vermarkten.

⚡ ExeOutput for PHP

PHP-Anwendungen in eigenständige Windows-EXE-Dateien kompilieren – ideal für sichere Auslieferung Ihrer Web-Anwendungen.

Jetzt ansehen →

📄 HTML Executable

HTML-Dateien und Websites als eigenständige Windows-EXE-Dateien kompilieren.

Jetzt ansehen →

🔒 XLS Padlock

Excel-Arbeitsmappen als EXE kompilieren und schützen – perfekt für datenbank-gestützte Excel-Lösungen.

Jetzt ansehen →

🐍 VBA Padlock

VBA-Code kompilieren und Office-Lösungen verkaufen – ohne Source-Code-Weitergabe.

Jetzt ansehen →

📦 Paquet Builder

Professionelle Windows-Installationsprogramme für Ihre Anwendungen erstellen.

Jetzt ansehen →

* Affiliate-Links: Bei einem Kauf über diese Links erhalten wir eine kleine Provision – für Sie entstehen keine zusätzlichen Kosten.

1. Was bedeutet Web-Sicherheit?

Web-Sicherheit schützt Anwendungen, Benutzerkonten, Daten und Geschäftsprozesse vor unbefugtem Zugriff, Manipulation, Offenlegung und Ausfall. Sie umfasst Code, Konfiguration, Infrastruktur, Berechtigungen, Betrieb und Reaktion auf Vorfälle.

Anwendung

Eingaben, Ausgaben, Geschäftslogik, Anmeldung, Sitzungen und Zugriffsentscheidungen.

Plattform

Webserver, Datenbank, Betriebssystem, Cloud-Dienste, Netzwerk und Konfiguration.

Lebenszyklus

Planung, Entwicklung, Tests, Veröffentlichung, Updates, Überwachung und Notfallreaktion.

Sicherheit ist kein einzelnes Schloss: HTTPS, Firewall oder ein Sicherheits-Plugin lösen nicht alle Probleme. Wirksamer Schutz entsteht aus mehreren abgestimmten Ebenen, klaren Verantwortlichkeiten und regelmäßiger Pflege.
Recht und Verantwortung: Teste Sicherheitsmaßnahmen nur an Systemen, für die du ausdrücklich verantwortlich oder autorisiert bist. Unangekündigte Tests fremder Webseiten können Schäden verursachen und rechtliche Folgen haben.

Die drei Säulen der Web-Sicherheit

  • Prävention: Sichere Architektur, Code, Konfiguration und Updates
  • Detektion: Überwachung, Logging, Alarmierung und Schwachstellenscans
  • Reaktion: Notfallplan, Backups, Isolation, Analyse und Wiederherstellung

2. Schutzziele und Defense in Depth

Die Sicherheit einer Webanwendung lässt sich anhand der klassischen Schutzziele bewerten. Diese sollten bei jeder Entscheidung mitgedacht werden.

Vertraulichkeit

Informationen sind nur für berechtigte Personen und Systeme zugänglich. Daten werden verschlüsselt übertragen und gespeichert.

Integrität

Daten und Funktionen werden nicht unbemerkt oder unbefugt verändert. Änderungen sind nachvollziehbar und geschützt.

Verfügbarkeit

Systeme und Daten stehen im erforderlichen Umfang zuverlässig bereit – gegen Ausfälle, Überlastung und Angriffe geschützt.

Authentizität

Identitäten und Herkunft von Daten können angemessen geprüft werden – wer ist wer und wer hat was gesendet?

Nachvollziehbarkeit

Wichtige Vorgänge sind mit geschützten Protokollen untersuchbar – wer hat wann was getan und warum?

Datensparsamkeit

Nur erforderliche personenbezogene und sensible Daten werden verarbeitet – weniger Daten bedeuten weniger Risiko.

Defense in Depth – Mehrere Schutzschichten

Sicheres DesignBedrohungen und Missbrauchsfälle
Sicherer CodeValidierung, Encoding, Berechtigungen
Sicherer BetriebUpdates, Monitoring, Backups
Minimalprinzip: Benutzer, Plugins, Dienste und Datenbankkonten erhalten nur die Rechte, die sie für ihre Aufgabe benötigen – und nur so lange wie nötig.

Beispiel für Defense in Depth bei einer Anmeldung

  • HTTPS schützt die Verbindung (Transportebene)
  • Passwort-Hashing schützt die gespeicherten Daten (Speicherebene)
  • MFA bietet zusätzliche Absicherung (Authentifizierungsebene)
  • Rate Limiting schützt vor automatisierten Angriffen (Betriebsebene)
  • Logging und Alarmierung erkennen Auffälligkeiten (Überwachungsebene)

3. OWASP Top 10:2025 im Detail

Die OWASP Top 10 ist ein Sensibilisierungsdokument für bedeutende Risiken von Webanwendungen. Sie ist ein guter Einstieg, ersetzt aber keine vollständige Risikoanalyse oder einen Prüfstandard.

A01

Broken Access Control

Fehlende oder fehlerhafte Berechtigungsprüfungen erlauben unerlaubte Aktionen oder Datenzugriffe. Häufige Ursache: serverseitige Prüfungen vergessen.

A02

Security Misconfiguration

Unsichere Standardwerte, unnötige Funktionen, offene Dienste oder fehlerhafte Header. Oft durch fehlende Härtung oder unvollständige Konfiguration.

A03

Software Supply Chain Failures

Risiken in Abhängigkeiten, Build-Systemen, Verteilung und Lieferkette – von kompromittierten Paketen bis zu unsicheren Update-Kanälen.

A04

Cryptographic Failures

Fehlender, ungeeigneter oder falsch eingesetzter kryptografischer Schutz – veraltete Algorithmen, schwache Schlüssel oder fehlende Verschlüsselung.

A05

Injection

Unvertrauenswürdige Daten beeinflussen Befehle, Abfragen oder ausgegebene Inhalte. SQL-Injection ist die bekannteste Form.

A06

Insecure Design

Sicherheitsanforderungen und Missbrauchsfälle fehlen bereits im Entwurf – Sicherheit wird erst nachträglich betrachtet.

A07

Authentication Failures

Schwächen bei Anmeldung, Wiederherstellung, Schutz vor automatisierten Versuchen oder fehlende MFA.

A08

Software or Data Integrity Failures

Software, Updates oder Daten werden ohne ausreichende Integritätsprüfung vertraut – Manipulation bleibt unerkannt.

A09

Security Logging & Alerting Failures

Relevante Ereignisse werden nicht ausreichend erkannt, protokolliert oder gemeldet – Angriffe bleiben unbemerkt.

A10

Mishandling of Exceptional Conditions

Fehlerzustände, Grenzfälle oder Ausnahmen führen zu unsicherem Verhalten – Informationen preisgeben oder Schutzmaßnahmen deaktivieren.

Keine Rangliste für dein Projekt: Die konkrete Priorität hängt von Daten, Funktionen, Bedrohungen und Auswirkungen deiner Anwendung ab. Beginne mit einem eigenen Bedrohungsmodell.

Wie du mit der OWASP Top 10 arbeitest

  1. 1
    VerstehenLies die Beschreibungen und Beispiele der einzelnen Risiken.
  2. 2
    BewertenPrüfe, ob das Risiko für deine Anwendung relevant ist.
  3. 3
    PriorisierenBehandle zuerst die Risiken mit hoher Auswirkung und hoher Wahrscheinlichkeit.
  4. 4
    UmsetzenPlane konkrete Gegenmaßnahmen – nicht nur technisch, sondern auch organisatorisch.
  5. 5
    PrüfenTeste die Wirksamkeit und überwache kontinuierlich – Sicherheit ist ein Prozess.

4. HTTPS, TLS und HSTS

HTTPS verwendet TLS, um die Verbindung zwischen Browser und Server zu verschlüsseln, ihre Integrität zu schützen und die Identität des angesprochenen Servers anhand des Zertifikats zu prüfen.

Verschlüsselung

Dritte im Übertragungsweg sollen Inhalte nicht einfach mitlesen können – insbesondere in öffentlichen Netzwerken.

Integrität

Manipulationen des Datenverkehrs sollen erkannt beziehungsweise verhindert werden – niemand ändert unbemerkt deine Daten.

Serverauthentisierung

Das Zertifikat bindet den öffentlichen Schlüssel an den aufgerufenen Domainnamen – du weißt, mit wem du wirklich sprichst.

Wie TLS funktioniert (vereinfacht)

Client Browser
Handshake Zertifikat prüfen & Schlüssel aushandeln
Verschlüsselte Verbindung Sichere Datenübertragung

HSTS als zusätzliche Transportregel

HTTP-AntwortheaderNur über HTTPS senden
Strict-Transport-Security: max-age=31536000; includeSubDomains

HSTS weist Browser an, zukünftige Verbindungen zu diesem Host nur per HTTPS aufzubauen. includeSubDomains darf erst aktiviert werden, wenn wirklich alle Subdomains dauerhaft HTTPS unterstützen.

HSTS-Preloading

Für noch mehr Sicherheit kann die Domain in die HSTS-Preload-Liste der Browser aufgenommen werden. Dann vertrauen Browser schon beim ersten Besuch darauf, dass die Seite nur HTTPS verwendet – ohne jemals einen HTTP-Request zu senden.

HTTP-AntwortheaderFür Preloading
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Schloss-Symbol richtig verstehen: HTTPS bedeutet nicht, dass die Webseite vertrauenswürdig, schadcodefrei oder korrekt programmiert ist. Es schützt in erster Linie die Verbindung.
Let's Encrypt: Kostenlose TLS-Zertifikate sind heute der Standard. Automatische Erneuerung einrichten, damit der Schutz nicht ausläuft.

5. Authentifizierung und Zugriffskontrolle

Authentifizierung prüft, wer jemand ist. Autorisierung entscheidet, was diese Identität tun darf. Jede geschützte Aktion benötigt eine serverseitige Berechtigungsprüfung.

Identität prüfenPasskey, MFA oder Passwort
Berechtigung prüfenDarf dieser Benutzer diese Ressource ändern?
Aktion ausführenOder sicher ablehnen

Grundregeln für Zugriffsschutz

  • Standardmäßig verweigern und nur benötigte Rechte erlauben.
  • Jede Anfrage serverseitig prüfen, nicht nur Menüpunkte verstecken.
  • Objektberechtigungen prüfen: Darf Benutzer A genau Datensatz B sehen?
  • Administrative Funktionen getrennt und besonders stark schützen.
  • Berechtigungsänderungen protokollieren und regelmäßig überprüfen.
  • Fehler sicher schließen: Bei Unsicherheit Zugriff ablehnen.

Rollenbasierte Zugriffskontrolle (RBAC)

RolleRessourceErlaubte Aktionen
BesucherÖffentliche SeitenLesen (GET)
Registrierter BenutzerEigenes ProfilLesen, Aktualisieren (GET, POST, PUT)
RedakteurBlog-BeiträgeLesen, Erstellen, Aktualisieren, Löschen
AdministratorAlle RessourcenAlle Aktionen
Frontend ist keine Sicherheitsgrenze: Deaktivierte Buttons und versteckte Links verbessern die Bedienung, ersetzen aber niemals eine Prüfung im Backend.
Best Practice: Verwende das Authorization-Framework deines gewählten Web-Frameworks (z.B. Spring Security, Django Permissions, ASP.NET Core Authorization). Diese Lösungen sind erprobt und decken viele häufige Fallstricke ab.

6. Passwörter und Mehrfaktor-Anmeldung

Passwörter bleiben ein zentraler Bestandteil der Authentifizierung – aber sie allein reichen nicht mehr aus. Eine Kombination aus starken Passwörtern und Mehrfaktor-Authentifizierung (MFA) ist heute der Mindeststandard.

Passwörter

Lange, einzigartige Passwörter beziehungsweise Passphrasen erlauben und Passwortmanager unterstützen. 8 Zeichen sind das absolute Minimum – besser 16+.

MFA

Für sensible Konten mindestens einen zusätzlichen Faktor vorsehen; phishing-resistente Verfahren (z.B. FIDO2/WebAuthn) bevorzugen, wo sinnvoll.

Wiederherstellung

Passwort-Reset und Kontowiederherstellung genauso sorgfältig absichern wie die Anmeldung – oft die schwächste Stelle.

Missbrauchsschutz

Automatisierte Anmeldeversuche erkennen, begrenzen und risikobasiert behandeln – z.B. durch Rate Limiting oder CAPTCHA.

Passwörter sicher speichern

Passwörter werden niemals im Klartext oder reversibel verschlüsselt gespeichert. Verwende die etablierte Passwort-API des Frameworks mit einem langsamen Passwort-Hashing-Verfahren wie Argon2id, bcrypt oder PBKDF2 und individuellen Salts.

PrinzipFramework-API verwenden
NICHT: datenbank.passwort = passwort_im_klartext
NICHT: datenbank.passwort = sha256(passwort)

RICHTIG: hash = framework.password_hash(passwort)
PRÜFEN: framework.password_verify(passwort, hash)

Was ist ein gutes Passwort?

  • Länge: Mindestens 12 Zeichen, besser 16 oder mehr
  • Einzigartigkeit: Für jeden Dienst ein eigenes Passwort
  • Passphrasen: Mehrere Wörter kombiniert (z.B. BlauerHimmel22!Hund)
  • Keine persönlichen Informationen: Namen, Geburtsdaten oder häufige Wörter vermeiden
  • Passwortmanager: Empfohlen, um starke, einzigartige Passwörter zu verwalten
Moderne Regel: Keine willkürlichen regelmäßigen Passwortwechsel verlangen. Wechsel ist insbesondere bei bekanntem oder vermutetem Kompromiss erforderlich. Lange Eingaben nicht stillschweigend abschneiden.

Mehrfaktor-Authentifizierung (MFA)

  • Wissen: Passwort, PIN oder Sicherheitsfrage
  • Besitz: Smartphone (TOTP), Sicherheits-Key (FIDO2) oder SMS (weniger sicher)
  • Inhärenz: Fingerabdruck, Gesichtserkennung oder Iris-Scan

MFA kombiniert mindestens zwei dieser Faktoren. Besonders sicher sind FIDO2/WebAuthn (phishing-resistente Sicherheitsschlüssel).

7. Sitzungen und Cookies

Nach der Anmeldung hält eine Sitzung den authentisierten Zustand. Eine gestohlene Sitzungskennung kann deshalb ähnlich kritisch sein wie gestohlene Zugangsdaten.

HTTP-AntwortheaderBeispiel – an Anwendung anpassen
Set-Cookie: session=zufaelliger_wert; Secure; HttpOnly; SameSite=Lax; Path=/
AttributZweckHinweis
SecureCookie nur über HTTPS senden.Die gesamte Sitzung muss HTTPS verwenden.
HttpOnlyJavaScript-Zugriff auf das Cookie verhindern.Reduziert bestimmte Folgen von XSS, verhindert XSS aber nicht.
SameSite=LaxCross-Site-Versand einschränken.Guter Standard, für sensible Anwendungen Strict in Betracht ziehen.
SameSite=StrictCookie nur bei gleicher Site senden.Bester CSRF-Schutz, kann aber Benutzererfahrung beeinträchtigen.
Path / DomainGültigkeitsbereich begrenzen.So eng wie funktional möglich konfigurieren.
Max-Age / ExpiresLebensdauer des Cookies begrenzen.Kurze Lebensdauer reduziert Risiko gestohlener Sitzungen.

Weitere Sitzungsregeln

  • Framework-Sitzungsverwaltung statt Eigenbau verwenden.
  • Sitzungskennung nach Anmeldung und Rechtewechsel erneuern.
  • Leerlauf- und absolute Zeitbegrenzung serverseitig durchsetzen.
  • Abmeldung und Ablauf müssen die Sitzung serverseitig ungültig machen.
  • Sitzungskennungen nicht in URLs, Logs oder Fehlermeldungen aufnehmen.
  • Bei sensiblen Aktionen (z.B. Passwortänderung) erneute Authentifizierung verlangen.
Sitzungsfixierung: Stelle sicher, dass die Sitzungskennung nach erfolgreicher Anmeldung erneuert wird – sonst könnte ein Angreifer eine bekannte Kennung vorgeben.

8. Eingabevalidierung und kontextbezogene Ausgabecodierung

Validierung prüft, ob eine Eingabe fachlich und technisch zulässig ist. Ausgabecodierung sorgt dafür, dass Daten im jeweiligen Ausgabekontext als Text und nicht als ausführbarer Code interpretiert werden.

Validieren

Typ, Länge, Wertebereich, Format und erlaubte Werte serverseitig prüfen. Ablehnen, was nicht erlaubt ist.

Sanitisieren

Nur verwenden, wenn bestimmte Inhalte bewusst bereinigt werden müssen, etwa erlaubtes Rich Text HTML mit einer etablierten Bibliothek.

Codieren

Ausgabe passend zu HTML, Attribut, URL, JavaScript oder CSS behandeln – nie ungeprüft ausgeben.

Beispiele für kontextbezogene Codierung

KontextCodierungBeispiel
HTMLHTML-Entitäten< → &lt;
HTML-AttributAttribut-Codierung" → &quot;
URLURL-Codierung %20
JavaScriptJavaScript-Codierung' → \'
CSSCSS-Codierungurl() sicher behandeln
JSONJSON-Codierung" → \"
Unterschiedliche Aufgaben: Validierung ersetzt keine Ausgabecodierung. Ein Name mit Apostroph kann fachlich gültig sein und muss trotzdem im Ausgabekontext sicher behandelt werden.
Client und Server: Browservalidierung verbessert die Bedienung, kann aber umgangen werden. Sicherheitsrelevante Prüfungen müssen immer im Backend erfolgen.

Eingabevalidierung – Best Practices

  • Erlaubnislisten (Allowlists): Definiere, was erlaubt ist – lehne alles andere ab.
  • Typ-Prüfung: Stelle sicher, dass Zahlen wirklich Zahlen sind, E-Mails dem Format entsprechen, etc.
  • Längenbegrenzung: Begrenze Eingaben auf sinnvolle Längen, um Pufferüberläufe und Denial-of-Service zu verhindern.
  • Format-Prüfung: Nutze reguläre Ausdrücke für erwartete Formate (z.B. Postleitzahl, Telefonnummer).
  • Serverseitige Validierung: Client-seitige Validierung ist nett – aber die serverseitige ist entscheidend.

9. SQL-Injection verhindern

SQL-Injection entsteht, wenn unvertrauenswürdige Daten durch Stringverkettung Teil der SQL-Syntax werden. Die wichtigste Abwehr ist die Trennung von Abfragestruktur und Daten über parametrisierte Abfragen.

Python mit DB-APIParameterbindung
# Unsicher: Eingabe wird Teil des SQL-Strings
sql = "SELECT id, name FROM kunden WHERE email = '" + email + "'"
cursor.execute(sql)

# Sicherer Ansatz: Platzhalter und getrennte Parameter
sql = "SELECT id, name FROM kunden WHERE email = ?"
cursor.execute(sql, (email,))

Weitere Beispiele für sichere Abfragen

Verschiedene SprachenParameterbindung
-- PHP mit PDO
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);

-- Java mit JDBC
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE email = ?");
stmt.setString(1, email);
ResultSet rs = stmt.executeQuery();

-- C# mit ADO.NET
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Email = @email", conn);
cmd.Parameters.AddWithValue("@email", email);

-- Node.js mit mysql2
const [rows] = await connection.execute(
    'SELECT * FROM users WHERE email = ?',
    [email]
);

Zusätzliche Schutzmaßnahmen

  • ORM oder Datenbank-API korrekt und parametrisiert verwenden.
  • Dynamische Tabellennamen oder Sortierspalten über feste Erlaubnislisten wählen.
  • Datenbankkonto nach Minimalprinzip berechtigen (nur SELECT, INSERT, UPDATE, DELETE, was wirklich nötig ist).
  • Detaillierte Datenbankfehler nicht an Besucher ausgeben (verwende generische Fehlermeldungen).
  • Validierung ergänzen, aber nicht als Ersatz für Parameterbindung betrachten.
  • Regelmäßige Schwachstellenscans durchführen.
Escaping allein ist keine Standardlösung: Manuelles Ersetzen einzelner Zeichen ist fehleranfällig und datenbankspezifisch. Verwende Parameterbindung der eingesetzten Bibliothek.
Merke: Eine SQL-Injection kann ganze Datenbanken kompromittieren. Parameterbindung ist die einfachste und effektivste Abwehr – immer verwenden!

10. XSS – Cross-Site Scripting verhindern

Bei XSS werden unvertrauenswürdige Inhalte so in eine Seite eingebunden, dass der Browser sie als aktiven Inhalt interpretiert. Mögliche Folgen reichen von manipulierten Ansichten bis zur Übernahme angemeldeter Aktionen.

Arten von XSS

  • Reflektiert (Non-Persistent): Die schädliche Eingabe wird sofort in der Antwort reflektiert – z.B. über URL-Parameter.
  • Gespeichert (Persistent): Die schädliche Eingabe wird in der Datenbank gespeichert und bei jedem Seitenaufruf ausgeliefert – z.B. in Kommentaren.
  • DOM-basiert: Die Schwachstelle liegt im client-seitigen JavaScript, nicht auf dem Server – z.B. bei unsicherer Verwendung von document.write oder innerHTML.
JavaScriptText statt HTML einfügen
const ausgabe = document.getElementById("ausgabe");

// Unsicher bei unvertrauenswürdigen Daten
ausgabe.innerHTML = benutzertext;

// Sicher für reine Textausgabe
ausgabe.textContent = benutzertext;

Schutzschichten gegen XSS

  • Automatische Ausgabecodierung des Frameworks nicht umgehen.
  • Kontextbezogen codieren: HTML ist nicht dasselbe wie URL oder JavaScript.
  • Für reinen Text sichere DOM-APIs wie textContent verwenden.
  • Wenn HTML fachlich nötig ist, eine bewährte Sanitizing-Lösung einsetzen (z.B. DOMPurify im Frontend, HTMLPurifier im Backend).
  • Eine strenge CSP als zusätzliche Schadensbegrenzung einführen.
  • HttpOnly-Cookies für Sitzungskennungen verwenden (erschwert Diebstahl durch XSS).
JavaScriptMit DOMPurify
// Erlaubtes HTML bereinigen
const sauberesHTML = DOMPurify.sanitize(rohesHTML, {
    ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p', 'br'],
    ALLOWED_ATTR: ['href', 'target']
});
ausgabe.innerHTML = sauberesHTML;
CSP ist keine Hauptabwehr: Eine Content Security Policy kann Auswirkungen reduzieren, ersetzt aber keine sichere Ausgabebehandlung und keine Beseitigung gefährlicher DOM-Verwendung.

11. CSRF verhindern

Cross-Site Request Forgery nutzt aus, dass ein Browser Authentifizierungs-Cookies automatisch mitsendet. Eine fremde Seite versucht dadurch, im Namen eines angemeldeten Benutzers eine zustandsändernde Aktion auszulösen.

CSRF-Schutzmaßnahmen

  • Eingebauten CSRF-Schutz des Frameworks verwenden.
  • CSRF-Token bei zustandsändernden Anfragen serverseitig validieren.
  • SameSite-Cookies passend konfigurieren (Strict oder Lax).
  • Origin, Fetch Metadata oder geeignete benutzerdefinierte Header als zusätzliche Ebene prüfen.
  • GET nur für lesende, nebenwirkungsfreie Operationen verwenden.
  • Besonders kritische Aktionen erneut bestätigen beziehungsweise reauthentisieren.
  • Double-Submit-Cookies als zusätzliche Schutzebene.
HTML-KonzeptToken muss im Backend geprüft werden
<form method="post" action="/profil/aktualisieren">
    <input type="hidden" name="csrf_token" value="SERVER_GENERATED_TOKEN">
    <!-- weitere Formularfelder -->
</form>
Server-KonzeptToken validieren
// Beispiel: CSRF-Token prüfen (Konzept)
if (request.method === 'POST') {
    const token = request.body.csrf_token;
    if (!token || token !== session.csrf_token) {
        throw new Error('CSRF-Schutz: Ungültiges Token');
    }
    // Aktion ausführen
}
XSS bleibt kritisch: Eine XSS-Schwachstelle kann viele CSRF-Schutzmaßnahmen umgehen. Deshalb müssen beide Risikoklassen getrennt behandelt werden.
Für APIs: Bei API-Endpunkten (z.B. REST) wird CSRF oft durch die Verwendung von Zugriffstoken (Bearer Tokens) im Authorization-Header entschärft – Browser senden diese nicht automatisch mit.

13. Datei-Uploads absichern

Datei-Uploads verbinden unvertrauenswürdige Inhalte mit Dateisystem, Parsern und späteren Downloads. Dateiendung und vom Browser gemeldeter Content-Type reichen für eine sichere Entscheidung nicht aus.

  1. 1
    Berechtigung prüfenNur authentisierte und autorisierte Benutzer dürfen hochladen.
  2. 2
    Erlaubnisliste verwendenNur fachlich benötigte Dateitypen, Größen und Mengen akzeptieren.
  3. 3
    Inhalt prüfenEndung, erkannter Typ, Signatur (Magic Bytes) und erwartete Struktur gemeinsam bewerten.
  4. 4
    Namen neu vergebenServerseitig erzeugte Namen verwenden und Pfade nicht aus Benutzereingaben bilden.
  5. 5
    Getrennt speichernMöglichst außerhalb des Webroots oder auf getrenntem Speicherdienst ohne Ausführungsrechte.
  6. 6
    Auslieferung kontrollierenBerechtigungen erneut prüfen und sichere Content-Type- sowie Download-Header senden.
  7. 7
    ScannenWenn möglich, Dateien mit Virenscanner oder Malware-Erkennung prüfen.

Dateityp-Prüfung – Magic Bytes

PythonDateisignatur prüfen
# Magic-Bytes für häufige Dateitypen
MAGIC_BYTES = {
    b'\xFF\xD8\xFF': 'jpg',
    b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A': 'png',
    b'\x25\x50\x44\x46': 'pdf',
    b'\x50\x4B\x03\x04': 'zip',
}

def pruefe_dateityp(datei_pfad):
    mit open(datei_pfad, 'rb') als f:
        header = f.read(8)
    für magic, typ in MAGIC_BYTES.items():
        wenn header.startswith(magic):
            gib typ zurück
    gib None zurück  # Unbekannter Typ
Archive und Dokumente: Entpackte Größe, verschachtelte Archive, Makros und Parser-Risiken berücksichtigen. Dateiverarbeitung sollte isoliert, begrenzt und überwacht erfolgen.
Sichere Downloads: Liefere Dateien nicht direkt aus, sondern über einen kontrollierten Endpunkt, der Berechtigungen prüft und den Content-Type explizit setzt.

14. Secrets und Software-Abhängigkeiten

Moderne Webanwendungen bestehen aus vielen Komponenten – jede davon kann eine Schwachstelle sein. Secrets und Abhängigkeiten müssen aktiv verwaltet werden.

Secrets

API-Schlüssel, Passwörter und private Schlüssel gehören nicht in Quellcode, öffentliches Git oder ausgelieferte Frontend-Dateien.

Abhängigkeiten

Direkte und transitive Pakete inventarisieren, Schwachstellen überwachen und Updates kontrolliert testen.

Build-Prozess

Repository, CI/CD, Paketquellen und Veröffentlichungsrechte gegen Manipulation schützen.

Nachvollziehbarkeit

Lockfiles, Reviews, signierte Artefakte und eine Komponentenübersicht unterstützen reproduzierbare Lieferungen.

Secrets sicher verwalten

  • Secrets niemals im Quellcode oder in Versionskontrolle ablegen.
  • Umgebungsvariablen oder Secrets-Management-Dienste verwenden (z.B. HashiCorp Vault, AWS Secrets Manager).
  • Regelmäßig rotieren – besonders bei Personalwechsel oder vermutetem Kompromiss.
  • Zugriff auf Secrets protokollieren und nach Minimalprinzip beschränken.
  • Automatische Scans auf Secrets in Commits (z.B. git-secrets, truffleHog).

Abhängigkeiten sicher verwalten

  • Ein Lockfile (z.B. package-lock.json, poetry.lock) sorgt für reproduzierbare Builds.
  • Regelmäßige Schwachstellen-Scans (z.B. npm audit, Dependabot, Snyk).
  • Abhängigkeiten nur aus vertrauenswürdigen Quellen beziehen (z.B. offizielle Registry).
  • Veraltete oder nicht mehr gewartete Pakete ersetzen.
  • Transitive Abhängigkeiten im Blick behalten – sie enthalten oft die meisten Schwachstellen.

Wenn ein Secret veröffentlicht wurde

  1. 1
    Sofort sperren oder rotierenNicht darauf vertrauen, dass das Löschen aus dem aktuellen Code genügt.
  2. 2
    Nutzung untersuchenProtokolle auf unbekannte oder missbräuchliche Verwendung prüfen.
  3. 3
    Ursache beseitigenSecrets-Verwaltung, Zugriffsrechte und Prüfungen verbessern.
  4. 4
    Historie bewertenRepository-Geschichte und Kopien fachkundig behandeln; Rotation bleibt zwingend.
Niemals Secrets in Git: Einmal in Git, bleibt das Secret auch nach dem Löschen in der Historie. Alle Kopien des Repositories sind betroffen. Rotation ist die einzige Lösung.

15. Logging, Backups und Notfallplan

Prävention allein reicht nicht. Ein Betrieb muss relevante Ereignisse erkennen, untersuchen und kontrolliert darauf reagieren können.

Protokollieren

Anmeldefehler, Rechteänderungen, administrative Aktionen und auffällige Eingaben erfassen.

Alarmieren

Relevante Muster müssen eine zuständige Person rechtzeitig erreichen; Logs ohne Auswertung helfen wenig.

Sichern

Dateien, Datenbank und Konfiguration getrennt sichern und Wiederherstellung regelmäßig testen.

Reagieren

Kontakte, Entscheidungswege, Isolation, Beweissicherung, Kommunikation und Wiederanlauf vorbereiten.

Logs schützen

Zugriff begrenzen, Integrität sichern und keine Passwörter, Tokens oder unnötigen personenbezogenen Daten protokollieren.

Üben

Wiederherstellung und Notfallablauf testen, bevor ein echter Vorfall eintritt.

Was gehört in ein Sicherheitslog?

  • Authentifizierung: Erfolgreiche und fehlgeschlagene Anmeldeversuche, Abmeldungen.
  • Autorisierung: Zugriffsverweigerungen, Rechteänderungen, administrative Aktionen.
  • Eingaben: Auffällige oder unerwartete Eingaben (z.B. SQL-Injection-Versuche).
  • Systemereignisse: Start/Stop, Konfigurationsänderungen, Updates.
  • Fehler: Ausnahmen, die auf Angriffe oder Fehlkonfiguration hinweisen könnten.
KonzeptKeine sensiblen Daten in Logs
NICHT: log.info("Benutzer " + email + " hat sich angemeldet")
RICHTIG: log.info("Benutzer " + user_id + " hat sich angemeldet")

NICHT: log.error("SQL-Fehler: " + sql_abfrage)
RICHTIG: log.error("SQL-Fehler bei Abfrage " + query_id)

Backup-Strategie

  • 3-2-1-Regel: 3 Kopien, 2 verschiedene Medien, 1 Kopie außerhalb
  • Vollständige Sicherungen: Dateien + Datenbank + Konfiguration
  • Regelmäßige Tests: Wiederherstellung in einer Testumgebung durchführen
  • Aufbewahrungszeit: Gesetzliche Anforderungen prüfen (z.B. DSGVO, Steuerrecht)
  • Verschlüsselung: Backups verschlüsseln, insbesondere wenn sie extern gespeichert werden
Backup-Grundsatz: Ein Backup ist erst dann verlässlich, wenn eine getestete Wiederherstellung innerhalb der benötigten Zeit möglich ist.

16. WordPress sicher betreiben

Bei WordPress umfasst die Angriffsfläche Core, Plugins, Themes, Benutzerkonten, Hosting, Dateien und Datenbank. Sicherheit ist deshalb eine laufende Betriebsaufgabe.

Aktuell halten

Core, Themes und Plugins zeitnah aktualisieren; Änderungen vorher sichern und bei größeren Updates testen.

Reduzieren

Nicht benötigte Plugins, Themes und Benutzer entfernen statt nur deaktivieren.

Rechte begrenzen

Administratorrechte nur für Aufgaben vergeben, die sie wirklich benötigen.

Anmeldung schützen

Einzigartige Zugangsdaten, MFA und Schutz gegen automatisierte Anmeldeversuche verwenden.

Komplett sichern

Datenbank und Dateien als zusammengehörigen Stand sichern und Rücksicherung testen.

Überwachen

Verfügbarkeit, Änderungen, Fehler und sicherheitsrelevante Ereignisse kontrollieren.

WordPress-Härtung – Erweiterte Maßnahmen

  • wp-config.php schützen: Verschiebe die Datei eine Ebene höher und setze starke Salt-Strings.
  • Standard-Admin-Benutzer entfernen: Erstelle einen individuellen Administrator-Namen.
  • Verzeichnisberechtigungen: 755 für Ordner, 644 für Dateien, außer wp-config.php (600).
  • wp-admin schützen: Zugriff über IP-Whitelist oder zusätzliche HTTP-Authentifizierung.
  • Login-URL ändern: Erschwert automatisierte Angriffe auf /wp-login.php.
  • XML-RPC deaktivieren: Wenn nicht benötigt, schließt es eine häufige Angriffsfläche.
  • File-Editor deaktivieren: define('DISALLOW_FILE_EDIT', true); in wp-config.php.

Praxisablauf vor einem Update

  1. 1
    Änderungen und Kompatibilität prüfenChangelog, aktive Abhängigkeiten und Hosting-Voraussetzungen betrachten.
  2. 2
    Dateien und Datenbank sichernBeide Teile gehören zu einem wiederherstellbaren Stand.
  3. 3
    Wenn möglich in Staging testenFunktionen, Formulare, Darstellung und Anmeldung prüfen.
  4. 4
    Produktiv aktualisierenWartungsfenster und Rückfallplan bereithalten.
  5. 5
    Nachkontrolle durchführenWebsite, Logs, Cache und kritische Geschäftsprozesse testen.
Backup vor jedem Update: Ein WordPress-Update kann selten auch inkompatible Plugins oder Themes betreffen. Ohne Backup gibt es keinen einfachen Rückweg.

17. Interaktiver Sicherheitsplaner

Wähle den Bereich, den du absichern möchtest. Der Planer liefert einen defensiven Startpunkt – keine automatische Sicherheitsprüfung.

Projektbereich auswählen

18. Sicherheits-Checkliste für Webseiten

Die Liste ist ein Einstieg und ersetzt keine anwendungsbezogene Sicherheitsprüfung. Die Auswahl bleibt nur während dieses Seitenaufrufs erhalten.

0 von 12 Punkten erledigt

19. Häufige Sicherheitsirrtümer

„HTTPS macht die Seite sicher“

HTTPS schützt die Verbindung. Fehlerhafte Berechtigungen, XSS, SQL-Injection oder kompromittierte Plugins bleiben möglich.

„Eingaben filtern reicht“

Validierung, Parameterbindung und kontextbezogene Ausgabecodierung erfüllen unterschiedliche Aufgaben und müssen passend kombiniert werden.

„Versteckte URL bedeutet geschützt“

Eine unbekannte Adresse ist keine Zugriffskontrolle. Das Backend muss Identität und Berechtigung bei jeder Anfrage prüfen.

„Backup des Hosters genügt immer“

Umfang, Aufbewahrung, Zugriff und Wiederherstellungszeit müssen bekannt und getestet sein. Eine getrennte Sicherung reduziert Abhängigkeiten.

„Sicherheits-Plugin reicht für WordPress“

Ein Plugin kann helfen, aber Updates, starke Passwörter, minimale Erweiterungen und regelmäßige Backups sind genauso wichtig.

„Meine Seite ist zu klein für Angriffe“

Automatisierte Angriffe scannen das gesamte Internet. Jede Seite mit einem Login oder Formular ist ein potenzielles Ziel.

20. Übungen zum Mitmachen

Arbeite nur mit eigenen Testprojekten oder ausdrücklich autorisierten Umgebungen.

Übung 1 · Einstieg

Schutzziele zuordnen

Ordne Datenleck, manipulierte Rechnung und Serverausfall den Schutzzielen Vertraulichkeit, Integrität und Verfügbarkeit zu.

Übung 2 · Einstieg

Zugriff modellieren

Erstelle eine Tabelle: Rolle, Ressource, erlaubte Aktion und serverseitige Prüfregel.

Übung 3 · Mittel

Sichere Ausgabe

Ersetze in einem Testprojekt eine unvertrauenswürdige innerHTML-Ausgabe durch textContent und vergleiche das Verhalten.

Übung 4 · Mittel

SQL-Injection erkennen

Analysiere folgenden Code und erkläre die Schwachstelle: SELECT * FROM users WHERE name = '" + name + "'

Übung 5 · Fortgeschritten

CSP konfigurieren

Entwirf eine Content Security Policy für eine Seite, die eigene Skripte und externe Bilder von einer CDN lädt.

Übung 6 · Betrieb

Wiederherstellung planen

Dokumentiere Dateien, Datenbank, Zugangsdaten, Verantwortliche und die Reihenfolge einer Testwiederherstellung.

Lösungshinweise

Hinweis zu Übung 1 anzeigen

Datenleck → Vertraulichkeit, manipulierte Rechnung → Integrität, Serverausfall → Verfügbarkeit.

Hinweis zu Übung 2 anzeigen

Beispiel: Rolle "Redakteur" kann "Beiträge" nur "Lesen, Erstellen, Aktualisieren", nicht "Löschen". Die Prüfung erfolgt serverseitig.

Hinweis zu Übung 3 anzeigen

textContent behandelt den Inhalt als reinen Text. innerHTML würde HTML interpretieren – und damit XSS ermöglichen.

Hinweis zu Übung 4 anzeigen

Der Code verwendet Stringverkettung. Eine Eingabe wie ' OR '1'='1 würde die WHERE-Klausel manipulieren und alle Datensätze zurückgeben.

Hinweis zu Übung 5 anzeigen

default-src 'self'; script-src 'self'; img-src 'self' https://cdn.example.com;

Hinweis zu Übung 6 anzeigen

Dokumentiere: Datei-Backup, Datenbank-Export, Konfiguration, Kontaktperson, Wiederherstellungsreihenfolge, Testplan.

21. Passende nächste Themen

22. Offizielle Quellen und Vertiefung

Stand dieser Zusammenfassung: August 2026. Prüfe bei konkreten Projekten immer die aktuelle Dokumentation des eingesetzten Frameworks und Hostings.

23. Häufige Fragen zur Web-Sicherheit

Reicht ein Sicherheits-Plugin für WordPress?

Nein. Ein Plugin kann bestimmte Schutz- und Überwachungsfunktionen ergänzen. Updates, sichere Konten, minimale Erweiterungen, HTTPS, Backups, Hosting-Konfiguration und Notfallplanung bleiben erforderlich.

Ist eine Webseite ohne Login überhaupt gefährdet?

Ja. Auch statische oder öffentliche Seiten können durch unsichere Abhängigkeiten, Fehlkonfiguration, kompromittierte Zugänge, DNS-Probleme, schädliche Einbindungen oder manipulierte Hosting-Dateien betroffen sein.

Was ist wichtiger: Validierung oder Ausgabecodierung?

Beide erfüllen verschiedene Aufgaben. Validierung prüft erlaubte Eingaben; Ausgabecodierung verhindert, dass Daten im jeweiligen Kontext als Code interpretiert werden. SQL benötigt zusätzlich Parameterbindung.

Was ist der Unterschied zwischen Authentifizierung und Autorisierung?

Authentifizierung prüft die Identität. Autorisierung prüft die Berechtigung für eine konkrete Ressource und Aktion.

Warum soll ich kein eigenes Passwortsystem bauen?

Authentifizierung, Hashing, Reset, Sitzungen und Missbrauchsschutz besitzen viele schwer erkennbare Randfälle. Etablierte Framework- und Identitätslösungen werden breiter geprüft und gepflegt.

Wie oft sollte ich Sicherheitsupdates installieren?

Es gibt keine einzige Frist für alle Updates. Bewerte Kritikalität, Erreichbarkeit und Herstellerhinweise, teste kontrolliert und installiere sicherheitsrelevante Korrekturen risikogerecht und zeitnah.

Kann ich meine Seite mit einem Online-Scanner vollständig prüfen?

Nein. Scanner erkennen nur bestimmte technische Signaturen und Konfigurationen. Berechtigungen, Geschäftslogik, Prozessfehler und projektspezifische Risiken benötigen zusätzliche manuelle Prüfung.

Was sollte ich bei einem Verdacht auf einen Angriff zuerst tun?

Ruhe bewahren, den Notfallplan aktivieren, Beweise und Logs schützen, weitere Schäden begrenzen und qualifizierte Unterstützung einbinden. Nicht vorschnell Dateien löschen, bevor der Vorfall nachvollziehbar gesichert wurde.

Was ist der Unterschied zwischen XSS und CSRF?

XSS führt Code im Browser des Opfers aus, oft um Daten zu stehlen. CSRF nutzt die bestehende Sitzung des Opfers, um Aktionen auszuführen, ohne dass das Opfer es merkt.

Was ist ein HSTS-Preload?

Die HSTS-Preload-Liste wird in Browsern ausgeliefert. Domains auf dieser Liste werden niemals über HTTP aufgerufen – selbst beim ersten Besuch nicht. Das bietet maximale Sicherheit, aber keine einfache Rückkehr zu HTTP.

Datenschutz-Übersicht
digitale-start-hilfe.de

Auf dieser Website werden Cookies verwendet, um deine Nutzererfahrung zu verbessern. Du kannst in den {setting}Einstellungen{/setting} mehr erfahren oder Cookies jederzeit ablehnen.

Eine vollständige Liste aller Cookies findest du in unserer Cookie-Erklärung.

Weitere Informationen findest du in unserer Datenschutzerklärung.

Notwendige Cookies & Chatbot

Diese Cookies sind für den Betrieb der Website unbedingt erforderlich und können nicht deaktiviert werden. Dazu gehören auch grundlegende Funktionen wie der WebChatAgent (Chatbot) von WebChatAgent.com, der die direkte Kommunikation mit uns ermöglicht.