🔒 Sicherheit im Web
Webseiten, Benutzerkonten und Daten mit mehreren Schutzschichten absichern – verständlich erklärt, mit sicheren Codebeispielen und einer Praxis-Checkliste.
🛠️ 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.
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
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.
Broken Access Control
Fehlende oder fehlerhafte Berechtigungsprüfungen erlauben unerlaubte Aktionen oder Datenzugriffe. Häufige Ursache: serverseitige Prüfungen vergessen.
Security Misconfiguration
Unsichere Standardwerte, unnötige Funktionen, offene Dienste oder fehlerhafte Header. Oft durch fehlende Härtung oder unvollständige Konfiguration.
Software Supply Chain Failures
Risiken in Abhängigkeiten, Build-Systemen, Verteilung und Lieferkette – von kompromittierten Paketen bis zu unsicheren Update-Kanälen.
Cryptographic Failures
Fehlender, ungeeigneter oder falsch eingesetzter kryptografischer Schutz – veraltete Algorithmen, schwache Schlüssel oder fehlende Verschlüsselung.
Injection
Unvertrauenswürdige Daten beeinflussen Befehle, Abfragen oder ausgegebene Inhalte. SQL-Injection ist die bekannteste Form.
Insecure Design
Sicherheitsanforderungen und Missbrauchsfälle fehlen bereits im Entwurf – Sicherheit wird erst nachträglich betrachtet.
Authentication Failures
Schwächen bei Anmeldung, Wiederherstellung, Schutz vor automatisierten Versuchen oder fehlende MFA.
Software or Data Integrity Failures
Software, Updates oder Daten werden ohne ausreichende Integritätsprüfung vertraut – Manipulation bleibt unerkannt.
Security Logging & Alerting Failures
Relevante Ereignisse werden nicht ausreichend erkannt, protokolliert oder gemeldet – Angriffe bleiben unbemerkt.
Mishandling of Exceptional Conditions
Fehlerzustände, Grenzfälle oder Ausnahmen führen zu unsicherem Verhalten – Informationen preisgeben oder Schutzmaßnahmen deaktivieren.
Wie du mit der OWASP Top 10 arbeitest
- 1VerstehenLies die Beschreibungen und Beispiele der einzelnen Risiken.
- 2BewertenPrüfe, ob das Risiko für deine Anwendung relevant ist.
- 3PriorisierenBehandle zuerst die Risiken mit hoher Auswirkung und hoher Wahrscheinlichkeit.
- 4UmsetzenPlane konkrete Gegenmaßnahmen – nicht nur technisch, sondern auch organisatorisch.
- 5Prü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)
HSTS als zusätzliche Transportregel
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.
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
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.
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)
| Rolle | Ressource | Erlaubte Aktionen |
|---|---|---|
| Besucher | Öffentliche Seiten | Lesen (GET) |
| Registrierter Benutzer | Eigenes Profil | Lesen, Aktualisieren (GET, POST, PUT) |
| Redakteur | Blog-Beiträge | Lesen, Erstellen, Aktualisieren, Löschen |
| Administrator | Alle Ressourcen | Alle Aktionen |
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.
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
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.
Set-Cookie: session=zufaelliger_wert; Secure; HttpOnly; SameSite=Lax; Path=/
| Attribut | Zweck | Hinweis |
|---|---|---|
Secure | Cookie nur über HTTPS senden. | Die gesamte Sitzung muss HTTPS verwenden. |
HttpOnly | JavaScript-Zugriff auf das Cookie verhindern. | Reduziert bestimmte Folgen von XSS, verhindert XSS aber nicht. |
SameSite=Lax | Cross-Site-Versand einschränken. | Guter Standard, für sensible Anwendungen Strict in Betracht ziehen. |
SameSite=Strict | Cookie nur bei gleicher Site senden. | Bester CSRF-Schutz, kann aber Benutzererfahrung beeinträchtigen. |
Path / Domain | Gültigkeitsbereich begrenzen. | So eng wie funktional möglich konfigurieren. |
Max-Age / Expires | Lebensdauer 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.
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
| Kontext | Codierung | Beispiel |
|---|---|---|
| HTML | HTML-Entitäten | < → < |
| HTML-Attribut | Attribut-Codierung | " → " |
| URL | URL-Codierung | → %20 |
| JavaScript | JavaScript-Codierung | ' → \' |
| CSS | CSS-Codierung | url() sicher behandeln |
| JSON | JSON-Codierung | " → \" |
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.
# 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
-- 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.
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.writeoderinnerHTML.
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
textContentverwenden. - 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).
// Erlaubtes HTML bereinigen
const sauberesHTML = DOMPurify.sanitize(rohesHTML, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p', 'br'],
ALLOWED_ATTR: ['href', 'target']
});
ausgabe.innerHTML = sauberesHTML;
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 (StrictoderLax).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.
<form method="post" action="/profil/aktualisieren">
<input type="hidden" name="csrf_token" value="SERVER_GENERATED_TOKEN">
<!-- weitere Formularfelder -->
</form>
// 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
}
12. Sicherheits-Header und Content Security Policy
HTTP-Antwortheader können Browserfunktionen begrenzen und zusätzliche Schutzschichten aktivieren. Sie müssen zur Anwendung passen und sollten zunächst in einer Testumgebung geprüft werden.
| Header | Zweck | Hinweis |
|---|---|---|
Content-Security-Policy | Erlaubte Quellen und Browseraktionen einschränken. | Schrittweise entwickeln; Nonces oder Hashes für notwendige Skripte verwenden. |
Strict-Transport-Security | Zukünftige Verbindungen auf HTTPS festlegen. | Nur über HTTPS senden und Subdomains vorher prüfen. |
X-Content-Type-Options: nosniff | MIME-Sniffing einschränken. | Korrekte Content-Types bleiben erforderlich. |
Referrer-Policy | Weitergabe von Referrer-Informationen begrenzen. | Passend zu Analyse- und Datenschutzbedarf wählen. |
Permissions-Policy | Browserfunktionen wie Kamera oder Standort begrenzen. | Nur benötigte Funktionen freigeben. |
X-Frame-Options | Einbettung in Frames kontrollieren. | Hilft gegen Clickjacking; CSP hat frame-ancestors. |
Clear-Site-Data | Browser-Cache, Cookies und Storage löschen. | Nach Abmeldung oder bei Sicherheitsvorfall. |
Content Security Policy (CSP) im Detail
CSP ist ein mächtiger Mechanismus, der festlegt, welche Ressourcen die Seite laden darf. Eine gut konfigurierte CSP kann XSS, Clickjacking und andere Angriffe erschweren.
Strenger Ausgangspunkt für eine einfache Seite
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self';
img-src 'self' data:;
font-src 'self';
object-src 'none';
base-uri 'self';
frame-ancestors 'none';
form-action 'self'
CSP mit Nonces für dynamische Skripte
Content-Security-Policy:
script-src 'nonce-ABC123' 'strict-dynamic';
Content-Security-Policy-Report-Only beobachten und kontrolliert verschärfen.
CSP-Reporting
Mit Content-Security-Policy-Report-Only kannst du CSP ohne Blockierung testen. Verletzungen werden an eine konfigurierte Report-URI gesendet.
Content-Security-Policy-Report-Only:
default-src 'self';
report-uri /csp-report
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.
- 1Berechtigung prüfenNur authentisierte und autorisierte Benutzer dürfen hochladen.
- 2Erlaubnisliste verwendenNur fachlich benötigte Dateitypen, Größen und Mengen akzeptieren.
- 3Inhalt prüfenEndung, erkannter Typ, Signatur (Magic Bytes) und erwartete Struktur gemeinsam bewerten.
- 4Namen neu vergebenServerseitig erzeugte Namen verwenden und Pfade nicht aus Benutzereingaben bilden.
- 5Getrennt speichernMöglichst außerhalb des Webroots oder auf getrenntem Speicherdienst ohne Ausführungsrechte.
- 6Auslieferung kontrollierenBerechtigungen erneut prüfen und sichere Content-Type- sowie Download-Header senden.
- 7ScannenWenn möglich, Dateien mit Virenscanner oder Malware-Erkennung prüfen.
Dateityp-Prüfung – Magic Bytes
# 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
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
- 1Sofort sperren oder rotierenNicht darauf vertrauen, dass das Löschen aus dem aktuellen Code genügt.
- 2Nutzung untersuchenProtokolle auf unbekannte oder missbräuchliche Verwendung prüfen.
- 3Ursache beseitigenSecrets-Verwaltung, Zugriffsrechte und Prüfungen verbessern.
- 4Historie bewertenRepository-Geschichte und Kopien fachkundig behandeln; Rotation bleibt zwingend.
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.
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
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.phpschützen: Verschiebe die Datei eine Ebene höher und setze starke Salt-Strings.- Standard-Admin-Benutzer entfernen: Erstelle einen individuellen Administrator-Namen.
- Verzeichnisberechtigungen:
755für Ordner,644für Dateien, außerwp-config.php(600). wp-adminschü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);inwp-config.php.
Praxisablauf vor einem Update
- 1Änderungen und Kompatibilität prüfenChangelog, aktive Abhängigkeiten und Hosting-Voraussetzungen betrachten.
- 2Dateien und Datenbank sichernBeide Teile gehören zu einem wiederherstellbaren Stand.
- 3Wenn möglich in Staging testenFunktionen, Formulare, Darstellung und Anmeldung prüfen.
- 4Produktiv aktualisierenWartungsfenster und Rückfallplan bereithalten.
- 5Nachkontrolle durchführenWebsite, Logs, Cache und kritische Geschäftsprozesse testen.
17. Interaktiver Sicherheitsplaner
Wähle den Bereich, den du absichern möchtest. Der Planer liefert einen defensiven Startpunkt – keine automatische Sicherheitsprüfung.
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.
Schutzziele zuordnen
Ordne Datenleck, manipulierte Rechnung und Serverausfall den Schutzzielen Vertraulichkeit, Integrität und Verfügbarkeit zu.
Zugriff modellieren
Erstelle eine Tabelle: Rolle, Ressource, erlaubte Aktion und serverseitige Prüfregel.
Sichere Ausgabe
Ersetze in einem Testprojekt eine unvertrauenswürdige innerHTML-Ausgabe durch textContent und vergleiche das Verhalten.
SQL-Injection erkennen
Analysiere folgenden Code und erkläre die Schwachstelle: SELECT * FROM users WHERE name = '" + name + "'
CSP konfigurieren
Entwirf eine Content Security Policy für eine Seite, die eigene Skripte und externe Bilder von einer CDN lädt.
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
🌍 Server & Hosting
HTTPS, DNS, Deployment, Backups und laufenden Betrieb vertiefen.
Weiterlernen →🔌 API & REST
Authentifizierung, Autorisierung, Eingaben und sichere Schnittstellen verstehen.
Weiterlernen →🗄️ Datenbanken verstehen
Parameterbindung, Rechte und Schutz sensibler Daten einordnen.
Weiterlernen →🌿 Git & Versionskontrolle
Änderungen nachvollziehen, Reviews nutzen und Secrets aus Repositorys fernhalten.
Weiterlernen →22. Offizielle Quellen und Vertiefung
Stand dieser Zusammenfassung: August 2026. Prüfe bei konkreten Projekten immer die aktuelle Dokumentation des eingesetzten Frameworks und Hostings.
OWASP Top 10:2025
Aktuelle Übersicht bedeutender Risiken für Webanwendungen.
Offizielle Quelle öffnen ↗OWASP Cheat Sheet Series
Praxisleitfäden zu Injection, XSS, CSRF, Sessions, Uploads und weiteren Themen.
Offizielle Quelle öffnen ↗NIST SP 800-63B
Aktuelle Richtlinie zu Authentisierung und Authenticator-Management.
Offizielle Quelle öffnen ↗MDN Web Security
Browser-Sicherheitsmechanismen, CSP, HSTS und praktische Implementierungshinweise.
Offizielle Quelle öffnen ↗WordPress Hardening
Offizielle Hinweise für den sicheren Betrieb einer WordPress-Installation.
Offizielle Quelle öffnen ↗WordPress Backups
Dateien und Datenbank als vollständigen Wiederherstellungsstand behandeln.
Offizielle Quelle öffnen ↗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.
Dieser Leitfaden vermittelt Grundlagen und ersetzt keine professionelle Sicherheitsprüfung, Rechtsberatung oder projektspezifische Risikoanalyse.