← EnergyViewFase 4 — beveiliging zonder nieuwe datastromen
API
- Ook zonder/lege
CF-Connecting-IP wordt gelimiteerd: vaste sleutel __missing_ip__. Cloudflare-binding indien beschikbaar; anders dezelfde bestaande per-isolate best-effort limiet. Dit is geen wereldwijd gedeelde teller. Een storing in de binding blijft 503. - Alle bestaande JSON-POST-routes hebben een limiet van 65.536 bytes: Content-Length vóór lezen gecontroleerd, plus een harde stroomlimiet voor ontbrekende of onjuiste lengtes. Ongeldige JSON/objectvorm geeft 400, te groot 413, providerproblemen behouden hun eigen status. Geen nieuwe informatie naar providers.
- Marktprijsfouten zijn nu JSON met
error, no-store en behoud van Retry-After waar aanwezig. Succesdata/tarieven ongewijzigd.
Framing en Home Assistant
Een standaard frame-ancestors 'self' zou een bestaande HA-kaart met een elders gehoste app onmiddellijk blokkeren. Daarom geen algemene framingbeperking standaard geactiveerd. Expliciete buildoptie:
ENERGYVIEW_FRAME_ANCESTORS="self https://jouw-ha.example:8123" npm run build:pages
ENERGYVIEW_FRAME_ANCESTORS="self https://jouw-ha.example:8123" npm run build:worker
Alleen exacte http(s)-origins; geen wildcard/pad/injecteerbare CSP. De policy is identiek in Pages en Worker. Voor een zelfstandige publieke installatie is self aanbevolen; voor hosted HA alle gebruikte HA-origins expliciet toevoegen. Dit is een voorstel met veilige opt-in, geen claim dat het standaard-clickjackingrisico is opgelost. Lokale HA-bestanden krijgen hun HTTP-headers van HA zelf.
parentOrigin in de query wordt niet langer vertrouwd. De app controleert het directe parent-window, een browsergeleverde referrer/same-origin, of een willekeurige sessienonce die de bijgewerkte HA-kaart terugstuurt. Met verborgen referrer gaat alleen een ready-type + willekeurige nonce naar de parent met *; geen meetwaarden. De antwoord-origin wordt gepind. Verkeerde/opaque origins en andere windows afgewezen. Oude kaarten blijven werken met een bruikbare browserreferrer of same-origin; bij verborgen referrer én cross-origin moet ook ha-card.js worden bijgewerkt. Gebruik van getRandomValues werkt ook op normale lokale HTTP-HA-installaties (randomUUID zou daar ontbreken).
De vier bestaande numerieke sensorwaarden en hun eindigheids-/periodecontrole blijven gelijk. Het oorspronkelijke risico betrof vooral het beïnvloeden van deze instellingen door een embedder; geen uitbreiding naar accountovername of toegang tot CSV-bestanden. Een nonce machtigt de daadwerkelijke embedder, geen willekeurige site als vertrouwde organisatie; gebruik het optionele framebeleid voor die beperking.
PVGIS
Actieve route gebruikt PVGIS 6. Alleen de geëxporteerde legacy-normalizer voor het oude payloadformaat vermeldde hardcoded 5.3; die zegt nu PVGIS · Europese Commissie / JRC (oud gegevensformaat). Bestaande opgeslagen schattingen worden niet herschreven en behouden hun provenance. Geen cijfers gewijzigd.
Verificatie
Nieuwe regressies voor begrensde bodies (ook ontbrekende/vervalste lengte), ongeldige JSON, rate limiting zonder IP, JSON-marktprijsfouten, parent-handshake en opt-in framebeleid. Defaults behouden HA-framing. Geen echte Home Assistant-installatie beschikbaar: protocol- en bouwtests zijn geen volledige HA-browserintegratietest.
Volledige fasecontrole: 184/184 tests geslaagd; formatcontrole groen, geen nieuwe ESLint/checkJs-diagnosegroepen. Golden master opnieuw alle acht scenario's groen. Deployment-source-test groen. Nieuwe request-guards/protocoltests slagen; deze zeggen niets over de beschikbaarheid van echte providers. Browser: startpagina en gasformulier daadwerkelijk geopend, geen volledige HA-installatie of throttled-browsermeting beschikbaar.
Slotcontrole: ook de daadwerkelijk gebouwde, geminimaliseerde reportworker slaagt voor alle acht golden-scenario’s (zelfde toleranties/identiteiten).