ArtikelVibe coding

CSV-export i appen: urval, kolumner och behörighet

En fungerande exportknapp säger bara att en fil går att hämta. Bestäm vilka rader och kolumner som får följa med, och jämför den nedladdade filen med ett litet facit innan du använder verkliga uppgifter.

Publicerad · Senast granskad

Svarta, vita och mörkgröna klossar framför ljusa träskivor, med en röd diagonal list genom konstruktionen.
Bestäm vilka rader och kolumner som får följa med innan du kontrollerar exportfilen.
Exportens kontrakt

Beställ ett bestämt radurval, en lista över tillåtna kolumner och en behörighetskontroll på servern. Kontrollera sedan själva filen med två testkonton. Exemplen här är påhittade och proven är förslag; ingen egen Lovable-app har testats.

En exportknapp lämnar tre beslut obesvarade

Du har byggt en lista med anmälningar och ber modellen lägga till CSV-export. Knappen dyker upp, och filen innehåller namn. Men menade du raden som syns på skärmen, alla träffar efter sökningen eller varje anmälan som ditt konto får läsa? Ett prov där listan bara har en post kan inte skilja de tre alternativen åt.

Kolumnerna är ett andra beslut. I listan kanske du ser namn och status, medan lagringen också innehåller en intern anteckning. Beställ därför kolumner med namn i stället för att be om ”alla uppgifter”. Det tredje beslutet är vem som får exportera vems rader. Ett filter för ”mina anmälningar” är en beskrivning av önskat urval; det behöver också vara ett villkor som exportens serverväg upprätthåller.

Har du ännu inte en lista som kan sparas och laddas om, börja med kursavsnittet Spara data. Exportprovet nedan förutsätter att testposterna finns kvar när du öppnar appen igen.

Skriv ett kontrakt för urval, kolumner och behörighet

Välj ett av dessa lägen som första beställning. Flera lägen kan införas senare, men varje knapp eller val behöver beskriva vilket av dem som gäller. Här betyder ”synliga” den aktuella sidan i listan, inte alla rader som råkar vara inlästa i bakgrunden.

För exemplet väljer du filtrerat urval och fyra kolumner i ordningen id, namn, status, datum. Intern anteckning ska inte exporteras, och kolumnen ägare används bara i testets facit. Om resultatet är tomt väljer du en fil med endast kolumnrubriker. Bestäm även att ett misslyckat försök ska ge ett felmeddelande i stället för en fil som ser fullständig ut.

Beställning: avgränsad export

Lägg till en knapp ”Exportera filtrerat urval”. Exportera alla rader som matchar det aktiva statusfiltret och som det inloggade kontot får läsa, även på andra listsidor. Använd listans sortering. Exportera endast id, namn, status och datum, i den ordningen. Intern anteckning och ägare får inte vara med. Vid noll träffar ska filen bara innehålla rubriker. Vid fel ska försöket avbrytas och ett begripligt felmeddelande visas.

Kontrollera kontots behörighet på servern när exporten hämtar data. Beskriv vilken läsväg den använder och visa ett kontrollprov där konto A inte kan exportera konto B:s rader, även genom en direkt begäran till exportfunktionen. Ändra inte andra funktioner. Beskriv först vad du tänker ändra.

Supabases RLS-dokumentation skiljer tillgång till en operation från reglerna för vilka rader den får beröra. Ett fungerande sparprov är därför inte belägg för exportens läsväg. Dokumentationen anger också att service_role kan kringgå RLS. Om en serverfunktion använder sådan åtkomst behöver dess eget radurval granskas. Be om belägg för den väg som exporten faktiskt använder; en dold knapp räcker inte.

Radregler svarar dessutom på en annan fråga än kolumnlistan. Även en tillåten rad ska i detta kontrakt lämna sin interna anteckning utanför filen. Fortsätt i guiden Behörigheter i Lovable för arbetet med konton och serverregler.

Ett syntetiskt dataset med filtrerade och privata poster

Skapa två separata testkonton, A och B, och använd endast låtsasuppgifter. I detta föreslagna prov äger A tre poster och B två. Varje konto ska bara få läsa sina egna. Anteckningarna är avsiktligt lätta att söka efter i filen, så att ett läckage märks utan att du behöver använda en verklig privat uppgift.

IdÄgareNamnStatusDatumIntern anteckning
A01AÅsa TestÖppen2026-10-01PRIVAT-A01
A02ABertil TestStängd2026-10-02PRIVAT-A02
A03ACilla TestÖppen2026-10-03PRIVAT-A03
B01BDavid TestÖppen2026-10-04PRIVAT-B01
B02BEva TestStängd2026-10-05PRIVAT-B02

Sortera efter id i stigande ordning, välj status Öppen och ställ listan på en rad per sida. Konto A ser då A01 på första sidan och A03 på nästa. Det skapar tre olika facit: synlig första sida ger en rad, filtrerat urval två och alla tillåtna rader tre. Om appen saknar sidindelning, be modellen ordna ett tillfälligt provläge som visar en rad per sida innan du godkänner just den delen av kontraktet.

Kontrollera filen med två konton

Hämta en ny fil för varje prov och döp den så att konto och filter framgår. Kontrollera den filen, inte bara listan i appen eller modellens beskrivning av ändringen. Nedan gäller den beställda knappen för filtrerat urval; antalet avser datarader och räknar inte rubrikraden.

Föreslaget provFacit i filen
A, Öppen, första listsidan2 rader: A01 och A03
A, Öppen, nästa listsidaSamma 2 rader: A01 och A03
A, inget statusfilter3 rader: A01, A02 och A03
B, Öppen1 rad: B01
A, filter utan träffar0 datarader, endast rubriker

Varje fil ska ha exakt fyra kolumnrubriker: id, namn, status, datum. Kontrollera både rubrikerna och innehållet. Sök efter PRIVAT och efter det andra kontots id:n. För A:s filer är B01 och B02 förbjudna; för B:s fil är A01, A02 och A03 förbjudna. Kontrollera också att de tillåtna raderna finns en gång var och att värdena ligger under rätt rubrik. Rätt antal räcker inte om en tillåten post har ersatts av någon annans.

Be därefter modellen eller en tekniskt kunnig granskare prova exportens serverväg som konto A med ett försök att begära B:s rader. Begär ett protokoll som anger konto, begäran och svar utan hemliga nycklar. Godkänt i detta prov betyder att inga B-rader lämnas ut. Ett godkänt användarprov kompletterar serverkontrollen men bevisar inte ensamt att alla behörighetsvägar är skyddade.

Om å, ä och ö blir fel eller kolumnerna klumpar ihop sig, använd formatproven i Svenska i appen. Rätta formatet och kör urvalsproven igen; en läsbar fil med fel rader är fortfarande en felaktig export.

Formler i kalkylprogram och stopp före verkliga data

OWASP beskriver CSV-injektion: användarinmatning i en exporterad cell kan tolkas som en formel. Därför föreslår vi ett separat, ofarligt prov: byt A01:s namn till =1+2. Kravet är att namnet visas som text hos den avsedda mottagaren, även efter sparande och återöppning.

OWASP varnar för att Excel kan ta bort skyddande tecken vid återöppning. Beställ inte en enkel apostrof som generell lösning. Källan anger att ingen saneringsstrategi fungerar för alla kalkylprogram och vidare användningar. Ange mottagarprogram och syfte, och låt en sakkunnig kontrollera hanteringen.

Stoppvillkor

Ta inte in verkliga uppgifter om filen innehåller fel id, privata anteckningar eller extra kolumner, om serverkontrollen saknar belägg eller om formelprovet ändrar texten till ett beräknat värde. Beskriv felet med konto, filter, förväntade id och faktiska id. Kör samma prov efter rättningen innan du godkänner exporten.

Spara kontraktet och dina provfiler tillsammans med resultatet. När någon senare lägger till en kolumn eller ändrar listans filter finns då ett konkret facit att jämföra med. Att knappen fortfarande går att klicka på är bara början av kontrollen.