CSRF-Token sind die wirksamste Schutzmaßnahme gegen Cross-Site Request Forgery. Die korrekte Implementierung erfordert jedoch Sorgfalt: Ein falsch konfigurierter Token-Schutz wiegt Entwickler in falscher Sicherheit. Dieser Artikel beschreibt Best Practices für PHP-Anwendungen und JavaScript-Frontends.
Das Synchronizer Token Pattern
Das Standardverfahren für CSRF-Schutz funktioniert so: Der Server generiert bei jedem Seitenaufruf ein zufälliges Token und fügt es als verstecktes Feld in jedes Formular ein. Bei der Formularübermittlung prüft der Server, ob das mitgesendete Token mit dem in der Session gespeicherten Token übereinstimmt. Ein Angreifer kann dieses Token nicht erraten, weil er keinen Zugriff auf die Seite hat.
Best Practices für die Token-Generierung
- Kryptografisch sichere Zufallswerte verwenden: In PHP nutzen Sie
random_bytes(32)oderbin2hex(random_bytes(32)) - Token pro Session, nicht pro Request: Ein Token pro Session ist in der Praxis ausreichend und vermeidet Probleme mit mehreren Tabs oder dem Browser-Zurück-Button
- Token in der Session speichern: Nicht in Cookies – das würde Double-Submit-Cookie erfordern, was ein anderes Pattern ist
- Token bei Logout invalidieren: Nach dem Logout muss die Session und damit das Token zerstört werden
CSRF-Schutz für AJAX und REST-APIs
Bei AJAX-Requests und REST-APIs funktioniert das klassische Hidden-Field nicht. Stattdessen gibt es zwei bewährte Ansätze:
| Methode | Beschreibung | Vorteil |
|---|---|---|
| Custom Header (X-CSRF-Token) | Token wird als HTTP-Header mitgesendet | Cross-Origin-Requests können keinen Custom Header setzen |
| Double-Submit Cookie | Token wird als Cookie und als Request-Parameter gesendet | Funktioniert ohne serverseitige Session |
Häufige Implementierungsfehler
- Token nur für POST-Requests prüfen, aber GET-Requests Zustandsänderungen erlauben
- Token-Validierung für einzelne Routen deaktivieren, weil es „nicht funktioniert"
- Vorhersagbare Token verwenden (z.B. Timestamps oder Nutzer-IDs)
- Token nicht an die Session binden, sodass Token anderer Nutzer akzeptiert werden
Lassen Sie Ihre CSRF-Implementierung im Rahmen eines Security-Reviews prüfen. Wir analysieren Ihren Code auf typische Schwachstellen. Kontaktieren Sie uns für eine Beratung.
Fazit
CSRF-Token richtig zu implementieren ist nicht schwer – aber es erfordert Sorgfalt bei den Details. Nutzen Sie die eingebauten Mechanismen Ihres Frameworks, vermeiden Sie die beschriebenen Fehler und testen Sie den Schutz regelmäßig.