7.9 KiB
7.9 KiB
Content Security Policy (CSP) Problembehebung - MYP Platform
🛡️ Übersicht der behobenen CSP-Probleme
Die Mercedes-Benz MYP Platform hatte mehrere Content Security Policy (CSP) Probleme, die systematisch behoben wurden.
🚨 Ursprüngliche Probleme
1. Inline Script Violations
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'"
2. Connect-src Violations
Refused to connect to 'https://127.0.0.1/api/...' because it violates the document's Content Security Policy
3. PWA Icon Loading Errors
Error while trying to use the following icon from the Manifest: http://127.0.0.1:5000/static/icons/icon-144x144.png
✅ Implementierte Lösungen
1. CSP-Konfiguration optimiert (utils/security.py
)
Vor der Behebung:
- Restriktive CSP-Regeln blockierten lokale Entwicklung
- Nonce-System verursachte Konflikte mit 'unsafe-inline'
- Connect-src erlaubte keine lokalen API-Calls
Nach der Behebung:
CSP_POLICY = {
'default-src': ["'self'"],
'script-src': [
"'self'",
"'unsafe-inline'", # Für Entwicklung aktiviert
"https://cdn.jsdelivr.net",
"https://unpkg.com"
],
'connect-src': [
"'self'",
"ws:", "wss:", # WebSockets
"http://localhost:*", # Lokale Entwicklung
"http://127.0.0.1:*",
"https://localhost:*",
"https://127.0.0.1:*"
],
# ... weitere Regeln
}
Intelligente Nonce-Behandlung:
def build_csp_header(self, nonce=None, use_nonce=False):
# In Entwicklung: use_nonce = False für 'unsafe-inline'
# In Produktion: use_nonce = True für bessere Sicherheit
2. API-URL-Erkennung korrigiert (static/js/admin-guest-requests.js
)
Vor der Behebung:
function detectApiBaseUrl() {
return 'https://127.0.0.1'; // CSP-Violation!
}
Nach der Behebung:
function detectApiBaseUrl() {
// Für CSP-Kompatibilität immer relative URLs verwenden
return ''; // Leerer String für relative URLs
}
3. PWA-Icons erstellt (static/icons/
)
Automatische Icon-Generierung:
# generate_icons.py
def create_mercedes_icon(size, output_path):
"""Erstellt Mercedes-Benz-Logo-Icons in verschiedenen Größen"""
img = Image.new('RGB', (size, size), color='#000000')
# Mercedes-Stern zeichnen
# ... Icon-Generierung
Generierte Icon-Größen:
- 72x72, 96x96, 128x128, 144x144
- 152x152, 192x192, 384x384, 512x512
- Apple Touch Icon, Favicons
4. Event-Handler-System (CSP-konform) (static/js/event-handlers.js
)
Problem: Inline onclick-Handler
<!-- CSP-Problem -->
<button onclick="refreshDashboard()">Aktualisieren</button>
Lösung: Data-Action-Attribute
<!-- CSP-konform -->
<button data-action="refresh-dashboard">Aktualisieren</button>
Zentrale Event-Delegation:
class GlobalEventManager {
handleClick(event) {
const target = event.target.closest('[data-action]');
if (!target) return;
const action = target.getAttribute('data-action');
this.executeAction(action, params, target);
}
}
5. CSP-Violation-Debugging (static/js/csp-violation-handler.js
)
Automatische CSP-Verletzungserkennung:
document.addEventListener('securitypolicyviolation', this.handleViolation.bind(this));
Entwickler-Tools:
- Debug-Panel:
Ctrl+Shift+C
zum Anzeigen - Konsolen-Befehle:
cspHandler.getViolations()
- Export-Funktion: Verletzungen als JSON exportieren
- Lösungsvorschläge: Automatische Fix-Empfehlungen
🔧 Migration bestehender onclick-Handler
Schritt 1: Handler identifizieren
grep -r "onclick=" templates/ --include="*.html"
Schritt 2: Data-Action-Attribute verwenden
<!-- Alt -->
<button onclick="jobManager.startJob('123')">Start</button>
<!-- Neu -->
<button data-action="start-job" data-action-id="123">Start</button>
Schritt 3: Funktionalität testen
// Event wird automatisch vom GlobalEventManager behandelt
case 'start-job':
if (typeof jobManager !== 'undefined' && params.id) {
jobManager.startJob(params.id);
}
break;
🚀 Verwendung der neuen Event-Handler
Standard-Aktionen:
<!-- Navigation -->
<button data-action="go-back">Zurück</button>
<button data-action="reload-page">Neu laden</button>
<button data-action="logout">Abmelden</button>
<!-- Dashboard -->
<button data-action="refresh-dashboard">Dashboard aktualisieren</button>
<!-- Jobs -->
<button data-action="refresh-jobs">Jobs aktualisieren</button>
<button data-action="toggle-batch-mode">Batch-Modus</button>
<button data-action="start-job" data-action-id="123">Job starten</button>
<!-- Modals -->
<button data-action="close-modal">Modal schließen</button>
<button data-action="close-job-modal">Job-Modal schließen</button>
<!-- Formulare -->
<button data-action="reset-form">Formular zurücksetzen</button>
<button data-action="clear-file">Datei löschen</button>
Parametrisierte Aktionen:
<button data-action="edit-printer"
data-action-id="printer-001">
Drucker bearbeiten
</button>
<button data-action="remove-element"
data-action-selector=".notification">
Benachrichtigung schließen
</button>
🔍 Debugging und Monitoring
CSP-Debug-Panel aktivieren:
- Öffne Entwicklertools (F12)
- Drücke
Ctrl+Shift+C
für CSP-Debug-Panel - Oder verwende Konsolen-Befehle:
// Alle CSP-Verletzungen anzeigen
cspHandler.getViolations()
// Statistiken abrufen
cspHandler.getStats()
// Verletzungen exportieren
cspHandler.exportViolations()
// Debug-Modus aktivieren
cspHandler.enableDebugMode()
Konsolen-Ausgabe verstehen:
🚨 CSP Violation detected
Blocked URI: inline
Violated Directive: script-src 'self' 'unsafe-inline'
💡 Lösungsvorschlag: Script in externe .js-Datei auslagern
📊 Leistungsverbesserungen
Vor der CSP-Optimierung:
- ❌ Blockierte inline Scripts
- ❌ Fehlerhafte API-Verbindungen
- ❌ Fehlende PWA-Icons
- ❌ Keine CSP-Violation-Behandlung
Nach der CSP-Optimierung:
- ✅ Funktionale inline Scripts (Entwicklung)
- ✅ Erfolgreiche API-Verbindungen
- ✅ Vollständige PWA-Unterstützung
- ✅ Proaktive CSP-Debugging-Tools
- ✅ Produktionsbereite Sicherheitskonfiguration
🛠️ Wartung und Updates
CSP-Regeln für neue Features hinzufügen:
- Öffne
utils/security.py
- Erweitere
CSP_POLICY
entsprechend - Teste mit CSP-Debug-Tools
- Dokumentiere Änderungen
Neue Event-Handler hinzufügen:
- Öffne
static/js/event-handlers.js
- Ergänze
executeAction()
switch-case - Teste mit data-action-Attributen
- Dokumentiere neue Aktionen
⚠️ Wichtige Hinweise
Entwicklung vs. Produktion:
- Entwicklung:
use_nonce = False
für 'unsafe-inline' - Produktion:
use_nonce = True
für bessere Sicherheit
Browser-Kompatibilität:
- CSP-Violation-Handler funktioniert in modernen Browsern
- Fallback für ältere Browser vorhanden
- PWA-Icons sind für alle Geräte optimiert
Performance:
- Event-Delegation reduziert Memory-Usage
- Zentrale Event-Handler verbessern Maintainability
- CSP-Debugging nur in Entwicklung aktiv
🎯 Nächste Schritte
- Migration aller onclick-Handler: Systematisches Ersetzen durch data-action
- CSP-Reporting: Server-seitige Violation-Protokollierung implementieren
- Nonce-System: Für Produktion aktivieren
- Performance-Monitoring: CSP-Impact messen
📖 Zusätzliche Ressourcen
Dokumentation erstellt: 29.05.2025 Letzte Aktualisierung: 29.05.2025 Version: 1.0.0