Schweregrad: Niedrig (Code-Qualität / Performance)
Sammelissue für kleinere, nicht sicherheitskritische Verbesserungen.
1. N+1-Abfragen beim Rendern einer Stadt-Seite
CityController::showAction → AbstractController::createViewModelListForStationList ruft pro Station einzeln PollutionDataFactory::createDecoratedPollutantList() auf, was je Station eine eigene Native-Query (findCurrentDataForStation, DISTINCT ON … LIMIT 10) absetzt. Bei Städten mit vielen aktiven Stationen entstehen entsprechend viele DB-Round-Trips pro Seitenaufruf.
→ Empfehlung: Aktuelldaten aller Stationen einer Stadt in einer Abfrage laden (station_id IN (...), DISTINCT ON (station_id, pollutant)) und im PHP gruppieren.
2. Stille Fehlerunterdrückung in PostgisPersister::persistValues
Der Flush fängt UniqueConstraintViolationException und verschluckt sie kommentarlos; die API-Antwort bleibt 200. Bei Batch-Inserts wird nach dem ersten Konflikt der EntityManager geschlossen und der Rest des Batches nicht mehr persistiert, ohne dass der Client das erfährt.
→ Empfehlung: Flush-Konflikte kontrolliert behandeln (z. B. Upsert oder Einzel-Inserts mit clear()), statt die Exception stumm zu schlucken.
3. Fehlende Wert-Validierung in PUT /api/value
value (keine Plausibilitätsgrenzen), date_time (beliebig, auch weit in Zukunft) und tag (nur DB-seitig auf 32 Zeichen begrenzt → längere Werte erzeugen eine DBAL-Exception) werden ungeprüft übernommen. pollutant wird immerhin gegen eine Allowlist geprüft.
→ Empfehlung: Wertebereiche/Datum serverseitig validieren, tag-Länge vor dem Persistieren prüfen.
4. Toter/unerreichbarer Code
assets/js/limit-violation.js referenziert eine globale exceedanceData, die nirgends definiert/eingebunden wird (kein Webpack-Entry, in keinem Template gerendert).
StationRepository::findIndexedByProvider (mit sprintf('s.%s', $indexedField)) ist nicht HTTP-erreichbar/ungenutzt.
→ Empfehlung: aufräumen oder dokumentieren.
Erstellt im Rahmen eines automatisierten Sicherheits-/Qualitäts-Reviews. Bitte vor Umsetzung gegenprüfen.
Schweregrad: Niedrig (Code-Qualität / Performance)
Sammelissue für kleinere, nicht sicherheitskritische Verbesserungen.
1. N+1-Abfragen beim Rendern einer Stadt-Seite
CityController::showAction→AbstractController::createViewModelListForStationListruft pro Station einzelnPollutionDataFactory::createDecoratedPollutantList()auf, was je Station eine eigene Native-Query (findCurrentDataForStation,DISTINCT ON … LIMIT 10) absetzt. Bei Städten mit vielen aktiven Stationen entstehen entsprechend viele DB-Round-Trips pro Seitenaufruf.→ Empfehlung: Aktuelldaten aller Stationen einer Stadt in einer Abfrage laden (
station_id IN (...),DISTINCT ON (station_id, pollutant)) und im PHP gruppieren.2. Stille Fehlerunterdrückung in
PostgisPersister::persistValuesDer Flush fängt
UniqueConstraintViolationExceptionund verschluckt sie kommentarlos; die API-Antwort bleibt 200. Bei Batch-Inserts wird nach dem ersten Konflikt der EntityManager geschlossen und der Rest des Batches nicht mehr persistiert, ohne dass der Client das erfährt.→ Empfehlung: Flush-Konflikte kontrolliert behandeln (z. B. Upsert oder Einzel-Inserts mit
clear()), statt die Exception stumm zu schlucken.3. Fehlende Wert-Validierung in
PUT /api/valuevalue(keine Plausibilitätsgrenzen),date_time(beliebig, auch weit in Zukunft) undtag(nur DB-seitig auf 32 Zeichen begrenzt → längere Werte erzeugen eine DBAL-Exception) werden ungeprüft übernommen.pollutantwird immerhin gegen eine Allowlist geprüft.→ Empfehlung: Wertebereiche/Datum serverseitig validieren,
tag-Länge vor dem Persistieren prüfen.4. Toter/unerreichbarer Code
assets/js/limit-violation.jsreferenziert eine globaleexceedanceData, die nirgends definiert/eingebunden wird (kein Webpack-Entry, in keinem Template gerendert).StationRepository::findIndexedByProvider(mitsprintf('s.%s', $indexedField)) ist nicht HTTP-erreichbar/ungenutzt.→ Empfehlung: aufräumen oder dokumentieren.
Erstellt im Rahmen eines automatisierten Sicherheits-/Qualitäts-Reviews. Bitte vor Umsetzung gegenprüfen.