Website sichern mit Content Security Policy und Google Analytics

Lassen Sie Fenster und Türen geöffnet wenn Sie das Haus verlassen?

Content Security Policy (CPS) Response Header sind eine einfache Methode um Webseiten gegen Angriffe wie Cross Site Scripting (XSS) abzusichern.

Die nachträgliche Integration in eine gewachsene IT-Infrastruktur kann sich jedoch als eine schwer zu lösende Aufgabe erweisen.

Zum Glück kann man Content Security Policy Regeln im Reporting-Modus integrieren. In Kombination mit Google Analytics kann man dann mögliche Probleme und zukünftige Verstöße direkt auswerten.

 

Warum ist die Content Security Policy Integration schwierig?

  1. Die Dokumentation von verwendeten Web-Techniken fehlt
  2. Die Prüfung der CSP-Einstellungen gleicht der Suche nach der „Stecknadel im Heuhaufen“
  3. Die Integration von Content Security Policies in (bestehende) Webseiten ist mit Kosten verbunden
  4. Es ist nicht bekannt wo in Webprojekten durch CPS blockierte Techniken genutzt werden
  5. Technische Einschränkungen bei Projektstart werden als Blockade und nicht als Hilfe angesehene

Zeilenumbrüche im Response-Header und http2 Protokoll – Firefox kann Seiten nicht laden

Zeilenumbrüche im CSP-Response Header führen Firefox, selbst die aktuellste Version, zum Lade-Abbruch jeder Webseite! Mehr dazu unter fxsitecompat.com und bei bugzilla.mozilla.org

Webseiten sind – unabhängig ob kommerziell oder privat genutzt – die (meist) am stärksten genutzte Kontaktpunkte zwischen potentiellen Kunden und Unternehmen.

Die Sicherheit von Webseiten wird aber oft stark vernachlässigt, da selbst einfachste Mittel durch den ständigen Fortschritt der Browser- und Server-Technik nicht immer im Fokus von Entwicklern liegen.

  • Website-Entwickler fokussieren sich meist auf Browser oder Server
  • Unternehmen nehmen Back- und Front-End oft nicht als Einheit wahr
  • Agenturen werden oft nur mit Front-End Entwicklung beauftragt
  • Bestimmte IT-Bereiche werden aus Sicherheitsgründen von internen oder Dritten verwaltet

 

Content Security Beispiel-Fehler

YouTube iframe geblockt via CSP-Regel

 

Rechts ein YouTube Video das durch die CSP-Regeln nicht geladen wurde. Der Browser sendet via POST-Request an eine Reporting-URL den Payload im oben gezeigten Bild und gibt folgende Fehlermeldung in der Entwickler-Konsole aus.

Refused to frame 'https://www.youtube-nocookie.com/embed/pocsv39pNXA?rel=0' because it violates the following Content Security Policy directive: "frame-src 'self' maps.google.com pastebin.com".

Wie Content Security Policy Regeln integrieren?

1. Content-Security-Policy header prüfen

2. Content Security Policy Response Header generieren

 

Content Security Nginx-Konfiguration

Beispiel add_header Direktive für WordPress

 

Hier eine Beispiel-Konfiguration einer Content Security Policy für WordPress unter Nginx diese häufig genutzte Domains bereits enthält. Das Nginx-Konfigurations-beispiel enthält folgende Domains:

  • bootstrapcdn.com
  • google-analytics.com
  • googletagmanager.com
  • googleapis.com
  • maps.google.com
  • google.com
  • gstatic.com
  • gravatar.com
  • w.org
  • pastebin.com

Anmerkung: Auf unsafe-Anweisungen wie ‚unsafe-inline‘ ‚unsafe-eval‘ sollte verzichtet werden da man Cross-Site-Scripting (XSS) sonst wieder zulässig macht! Viele WordPress-Themes und Plugins nutzen jedoch inline-JavaScript.

 

Verstöße gegen CSP-Richtlinien an Google Analytics senden (Work in Progress!)

Mit Google Analytics Server-PHP-Reporting die CSP-Richtlinien überprüfen

 

Der folgende PHP-Code zum Senden einen Google Analytics Events ausgelöst durch den POST-Request des Browsers bei Verstößen gegen eine Content Security Policy ist noch nicht fertig gestellt.

CSP-Report PHP auf Pastebin

Mike Wiegand

Mike Wiegand

Zertifizierter Online Projekt-Manager nach GPM IPMA

Website Specialist @Brady, Seton Devision

Freelancer und Online Projektmanager mit Liebe für`s Detail

Sie suchen Unterstützung bei der Integration von Content Security Policies, CSP-Reports in Google Analytics oder Web-Projekten?

[contact-form-7 id=“200″ title=“Kontakt minimal“]