Data og rapportering
Sikker CSV- og Excel-eksport: en downloadknap er også en dataadgang
En rapporteksport samler ofte flere oplysninger end appens skærmbilleder viser ad gangen. Derfor skal serveren kontrollere bruger, virksomhed, filtre og felter, før filen bliver lavet. Selve regnearksformatet skal også håndteres bevidst, så tekst ikke bliver fortolket som formler, og data ikke går i stykker ved kommaer, linjeskift eller danske tegn.
Udgivet 17. september 2026 · Ca. 11 minutters læsetid
Behandl eksporten som et følsomt API-kald
At en bruger må se én ordre betyder ikke automatisk, at brugeren må hente alle ordrer, alle kunder eller skjulte interne felter. Eksportens rettighed og datamængde skal afgøres på serveren for hver request. En skjult knap eller et kunde-id sendt fra browseren er ikke adgangskontrol.
| Kontrol | Serveren skal afgøre | Fejl hvis browseren bestemmer |
|---|---|---|
| Omfang | Virksomhed, afdeling, sag og periode | Et ændret id henter en anden kundes data |
| Felter | En fast liste til den konkrete rapport | Interne noter eller persondata følger med |
| Grænser | Maksimal periode, poster og samtidige jobs | Én eksport belaster database eller cloudkonto |
| Levering | Modtager, udløb og aktuel adgang | Et gammelt link virker som permanent adgang |
Vælg felter til rapporten i kode
Eksportér ikke hele databaseobjektet og fjern enkelte felter bagefter. Brug en tilladt liste, som beskriver rapportens kolonner, rækkefølge og betydning. Det gør det tydeligt, hvad modtageren får, og forhindrer at et nyt internt felt pludselig kommer med i alle fremtidige filer.
- Brug forretningsnavne: Skriv forståelige kolonneoverskrifter og dokumentér enheder, valuta og tidszone.
- Minimér indholdet: Udelad tekniske id'er, interne noter og personoplysninger, som rapportens formål ikke kræver.
- Bevar nødvendige nøgler: Hvis filen skal afstemmes eller importeres, skal stabile referencer vælges bevidst frem for navn alene.
- Versionsmærk formatet: En integration skal kunne opdage, når kolonner eller betydning ændres.
Generér CSV som et format, ikke som sammenkædet tekst
CSV ser enkelt ud, men værdier kan selv indeholde skilletegn, citationstegn og linjeskift. RFC 4180 beskriver blandt andet, at felter med komma, dobbelte citationstegn eller linjeskift skal omsluttes af dobbelte citationstegn, og at et citationstegn i feltet fordobles. Brug en vedligeholdt serializer og test dens konkrete output i stedet for at samle rækker med join.
- Aftal dialekten: Dokumentér skilletegn, kolonneoverskrifter, tegnsæt, datoformat og tomme værdier.
- Hold visning og data adskilt: En dato eller et beløb til maskinimport bør ikke afhænge af brugerens lokale skærmformat.
- Brug korrekt svar: Lever CSV med en passende
text/csv-type og et bevidst tegnsæt. - Navngiv download sikkert:
Content-Disposition: attachmentkan give filen et navn; filnavnet må ikke bygge ukontrolleret på brugerinput.
Stop tekst fra at blive til en regnearksformel
OWASP kalder problemet CSV Injection eller Formula Injection. Når et regneark åbner en CSV-fil, kan en celle, der begynder med blandt andet =,+,- eller@, blive fortolket som en formel. Et kundenavn, en kommentar eller et importeret felt er derfor ubetroet, selv om det blot skal vises i en rapport.
- Skeln mellem mennesker og systemer. En fil til manuel læsning i et regneark kan have en anden sikker tekstpolitik end en maskinfil, som senere skal importeres ordret.
- Behandl hvert felt. Kontrollér den færdige celle efter afgrænsning og escaping; et skilletegn i input må ikke kunne starte en ny ubeskyttet celle.
- Test de programmer, virksomheden bruger. Excel, LibreOffice og andre værktøjer kan fortolke eller genskrive værdier forskelligt.
- Overvej et andet format. Hvis data skal flyttes maskinelt med faste typer, kan et dokumenteret JSON-format eller et rigtigt regnearksformat være mere egnet end CSV. Det valgte bibliotek og format skal stadig sikkerhedstestes.
Flyt store eksporter ud af browserrequestet
Små rapporter kan ofte streames direkte. Store datasæt bør ikke hentes samlet til browseren eller bygges i hukommelsen som én stor tekststreng. Brug en afgrænset forespørgsel eller databaseværktøj, stream resultatet, eller opret et baggrundsjob med tydelig status.
- Sæt grænser før arbejdet starter: Maksimal periode, antal poster, filstørrelse, samtidighed og køretid skal passe til appens risiko og kapacitet.
- Bevar et kendt udsnit: Notér filtre og skæringstidspunkt, så rapporten kan forklares, hvis data ændres under genereringen.
- Beskyt retries: Et genforsøg må ikke oprette mange identiske filer eller sende flere beskeder.
- Udløb filen: Midlertidige rapporter skal ligge privat, have kortlivet adgang og slettes efter den aftalte periode.
Log handlingen uden at kopiere rapporten
En eksport kan være vigtig at kunne forklare bagefter. Registrér aktør, virksomhed, rapporttype, filtre, tidspunkt, antal poster, resultat og et request- eller job-id. Log ikke hele filen, kortlivede downloadlinks eller de personoplysninger, som netop gør rapporten følsom.
Hvis filen indeholder persondata, er den en ny kopi med eget behov for adgang, opbevaring og sletning. En eksport til en medarbejders Downloads-mappe er ikke længere under appens fulde kontrol.
Test den færdige fil og hele adgangsvejen
- Forkert rolle, en anden virksomhed, ændret kunde-id og filtre uden for brugerens tilladte omfang.
- Navne og kommentarer med komma, semikolon, citationstegn, linjeskift, tabulator og danske tegn.
- Celler der begynder med formeltegn, samt værdier hvor et skilletegn forsøger at starte en ny celle.
- Tomme felter, meget lange felter, store tal, id'er med foranstillede nuller, datoer og tidszoner.
- Få, mange og ingen poster; afbrudt generering; timeout; gentaget request og udløbet downloadlink.
- Åbning i de regnearksprogrammer og importflows, som virksomheden faktisk bruger.
- Kontrol af antal, stikprøver, totaler og filtre mod det samme kendte testdatasæt.
Typiske fejl
- Knaprettighed bliver datarettighed: Alle, der kan se knappen, kan ændre requesten og hente et bredere udsnit.
- Hele objektet eksporteres: Nye interne felter følger automatisk med uden produktbeslutning eller sikkerhedstjek.
- CSV bygges med tekstsammenkædning: Citationstegn og linjeskift flytter indhold til forkerte kolonner eller rækker.
- Formeltegn ignoreres: Ubetroet tekst får først virkning, når en betroet medarbejder åbner filen.
- Eksporten bruger browserens data: Rapporten bliver ufuldstændig, manipulerbar eller begrænset til den aktuelle side i listen.
- Downloadlinket lever for evigt: En URL i mail, historik eller log bliver ved med at give adgang.
- Kun filen testes: Ingen prøver adgangskontrol, store datamængder, fejlstatus eller oprydning.
Tjekliste før rapporteksporten tages i brug
- ☐ Serveren kontrollerer bruger, rolle, virksomhed, rapporttype og hvert filter.
- ☐ Rapporten har en fast tilladt liste over kolonner og nødvendige data.
- ☐ Skilletegn, kolonner, tegnsæt, datoer, valuta, tomme værdier og formatversion er dokumenteret.
- ☐ En vedligeholdt serializer håndterer citationstegn, skilletegn og linjeskift.
- ☐ Ubetroede celler har en afprøvet politik mod formelinjektion.
- ☐ Store eksporter har grænser, stabil status og en hukommelsesvenlig generering.
- ☐ Midlertidige filer ligger privat og har kortlivet, aktuel adgang samt automatisk oprydning.
- ☐ Revisionssporet viser handling og resultat uden filindhold eller aktive links.
- ☐ Negative adgangstests beviser, at en anden kundes data ikke kan eksporteres.
- ☐ Den færdige fil er testet i de relevante regnearks- og importprogrammer.
- ☐ Antal, stikprøver, totaler og filtre afstemmes mod kendte testdata.
Relaterede guides
Officielle kilder
CSV og regnearksprogrammer har forskellige fortolkninger. Guiden følger de officielle format- og sikkerhedskilder nedenfor, men den valgte eksport skal altid afprøves med appens egne data, biblioteker og modtagerprogrammer.