Beveiliging
Laatst bijgewerkt: 8 augustus 2026
Hoe HACCP Hyve wordt gehost, wie waar bij kan en wat er met uw gegevens gebeurt. Alles op deze pagina beschrijft wat vandaag draait. Waar een maatregel er niet is, staat dat er.
Hosting en locatie van de gegevens
- De applicatie draait op Vercel in de Europese regio (Parijs).
- Gegevens staan in PostgreSQL op Supabase, op het Pro-plan, in een Europese regio.
- De database wordt alleen bereikt vanuit onze eigen servercode via Prisma. De publieke data-API van Supabase staat dicht.
Versleuteling
- Alles gaat over HTTPS. Strict Transport Security staat op twee jaar, geldt ook voor subdomeinen en is aangemeld voor preloading, zodat een browser niet terugvalt op onversleuteld HTTP.
- Verkeer tussen de applicatie en de database gaat over TLS.
- De opslag van de database wordt door Supabase versleuteld in ruste.
- Onze eigen externe databasedumps worden versleuteld met AES-256, met een sleutel afgeleid via PBKDF2, en zo weggeschreven dat alleen de eigenaar ze kan lezen.
Browser en applicatie afgeschermd
- Er wordt een Content Security Policy afgedwongen op elke response, die alleen onze aanbieders voor inloggen, betalen en trainingsvideo toelaat. Die wordt afgedwongen sinds 28 juli 2026, na drie weken alleen rapporteren zonder enige overtreding.
- Overtredingen worden nog steeds naar een eigen endpoint gemeld, zodat een terugval opvalt in plaats van stil te blijven.
- De site kan niet in een frame worden gezet: X-Frame-Options is DENY en frame-ancestors is none.
- Referrer-Policy is strict-origin-when-cross-origin en MIME-sniffing staat uit.
- Toegang tot camera en locatie staat uit per policy. De microfoon mag alleen op onze eigen origin, voor ingesproken invoer in de dagelijkse registraties.
Toegangsbeheer
- Elke pagina en elke serveractie begint met een controle op de rol van de ingelogde persoon. Niets wordt eerst getoond en daarna gecontroleerd.
- De rollen zijn bedrijfsbeheerder, vestigingsmanager, afdelingshoofd, assistent-afdelingshoofd, medewerker en onze eigen platformbeheerder. Een vestigingsmanager ziet één vestiging. Een afdelingshoofd ziet één afdeling.
- Onder bedrijfsbeheerder kan niemand iets doen met iemand van gelijke of hogere rol, en kan niemand iemand, zichzelf inbegrepen, hoger zetten dan zijn eigen rol mag toekennen.
- Elke identifier die de browser meestuurt wordt getoetst aan het bedrijf en het bereik van de aanvrager voordat er iets wordt weggeschreven.
- Definitief verwijderen kan alleen met onze platformbeheerdersrol, en vraagt om de bedrijfsnaam, of het woord DELETE, uitgetypt.
Scheiding tussen klanten
- Elke query die bedrijfsgegevens teruggeeft bevat een bedrijfsfilter, via één gedeelde helper in plaats van per pagina opnieuw geschreven.
- Het bereik faalt gesloten. Een vestigingsmanager zonder toegewezen vestiging matcht niemand, nooit het hele bedrijf.
- Row level security staat aan op elke tabel, zonder policies, waardoor die tabellen dicht staan voor de publieke API van Supabase. Een controlescript meldt elke tabel die openstaat en stopt met een foutcode.
- Pogingen over klantgrenzen zijn met tests gedekt: schrijven in de vestiging van een ander bedrijf, het team van een andere vestiging lezen, handelen boven je eigen rol, en bij de registraties van een ander bedrijf komen.
- Die tests draaien tegen een echte PostgreSQL-database in plaats van mocks, en de suite moet slagen voordat er een release uitgaat.
Inloggen
- Inloggen loopt via Clerk, met e-mail en met Google. De applicatie ziet of bewaart nooit een wachtwoord.
- Medewerkers komen binnen via een persoonlijke uitnodigingslink. Die link is een willekeurig token, werkt niet meer zodra het account bestaat, en opvragen is beperkt tot tien per minuut vanaf één adres.
- Een medewerker verwijderen stopt de toegang bij de volgende aanvraag en houdt het trainingsdossier dat het bedrijf bij een inspectie nodig heeft. Het is terug te draaien.
- Een gedeeld schermpje in de zaak logt in met één vestigingscode. De code en het bijbehorende sessietoken worden alleen als SHA-256-hash bewaard, de cookie is http-only en secure, verkeerde codes stoppen na vijf pogingen en worden daarna tot vijftien minuten vertraagd, en de vergelijking is timing-safe.
- Zo'n schermpje is geen persoon en kan geen enkele pagina van de beheeromgeving bereiken, want elk van die pagina's vraagt een ingelogde gebruiker om een rol en een scherm heeft die niet.
Betalingen
- Betalingen lopen via Stripe. Kaartgegevens komen nooit op onze servers en staan nooit in onze database.
- De checkout en het facturatieportaal worden door Stripe gehost.
- Webhooks van Stripe worden tegen een signing secret gecontroleerd voordat er iets wordt toegepast.
- Elke webhook-gebeurtenis wordt op id geclaimd, dus een herhaalde levering verandert niets. Faalt een handler, dan wordt de claim vrijgegeven en geeft het verzoek een fout, zodat Stripe opnieuw levert in plaats van dat de retry als duplicaat wordt gelezen.
Back-ups en herstel
- Supabase maakt op het Pro-plan automatische dagelijkse back-ups, bevestigd op 8 augustus 2026.
- We maken ook onze eigen volledige logische dumps, schema en gegevens, buiten het hostingaccount bewaard zodat ze het verlies van het project of van het account zelf overleven.
- De laatste twaalf dumps blijven staan, oudere worden verwijderd.
- Een herstel is op 16 juli 2026 getest in een apart PostgreSQL-cluster. Rijaantallen en certificaatnummers kwamen overeen met productie.
- Point-in-time recovery staat niet aan. Dat is op 17 juli 2026 zo besloten, en daarom is het herstelpunt hieronder een dag en geen minuten.
- We staan voor een herstelpunt van 24 uur en een hersteltijd van 24 uur. Hoe lang het geteste herstel duurde is niet vastgelegd, dus we beloven het getal waar we zeker van zijn en geen sneller getal.
Beschikbaarheid
- We staan voor 99,5% beschikbaarheid in een kalendermaand, gemeten op de bereikbaarheid van de applicatie.
- Servicecredits horen niet bij de standaardvoorwaarden. Een enterprise-overeenkomst kan ze toevoegen.
- Vercel en Supabase publiceren hun eigen beschikbaarheidsbeloften. Het getal hierboven is het onze, geen herhaling van het hunne.
Monitoring en logging
- Wijzigingen in personen, rollen, trainingstoewijzingen, vestigingsschermen, abonnementen en bedrijfsinstellingen gaan naar een auditlog met het bedrijf, wie handelde, wat er gebeurde, welk record en wanneer.
- Het auditlog is leesbaar voor onze platformbeheerdersrol, en de eigen regels van een bedrijf kunnen op verzoek worden geleverd.
- Runtime-logs bewaart Vercel zolang zijn plan dat biedt.
- Meldingen over de Content Security Policy komen op een eigen endpoint binnen, met een limiet per adres.
- Een versie-endpoint geeft de commit, de omgeving en de regio die draaien, zodat een release van buiten de applicatie te bevestigen is.
Subverwerkers
Vijf partijen verwerken gegevens in onze opdracht. Dit is dezelfde lijst als in onze verwerkersovereenkomst.
- Vercel, hosting van de applicatie, Europese regio
- Supabase, PostgreSQL-database, Europese regio
- Clerk, inloggen en identiteit
- Stripe, betalingen
- Resend, transactionele e-mail
We laten klanten weten voordat een subverwerker wordt toegevoegd of vervangen, en een klant kan bezwaar maken.
Spraakinvoer voor de dagelijkse registraties wordt alleen aangeboden waar die voor een omgeving is aangezet. Staat die aan, dan gaat een kort audiofragment naar Google Cloud Speech-to-Text om tekst van te maken, en het audiofragment zelf wordt niet bewaard. Elke klant met die instelling aan krijgt dat te horen, want het voegt een zesde verwerker toe.
Locatie en doorgifte van gegevens
- Productiegegevens van Europese klanten staan in de Europese Unie en worden vanuit Parijs geleverd.
- Staat een subverwerker buiten de Europese Unie, dan loopt de doorgifte onder een adequaatheidsbesluit of standaardcontractbepalingen.
- We verwerken persoonsgegevens onder de AVG, en voor klanten in Japan onder de Act on the Protection of Personal Information.
Verwijderen en exporteren
- Een bedrijfsbeheerder exporteert het volledige trainingsregister wanneer hij wil als CSV, zonder het ons te vragen.
- Certificaten en het dagelijkse registratieboek zijn als PDF te downloaden.
- Eén persoon kan op verzoek worden gewist. Het account bij onze inlogprovider, het trainings- en examendossier en de auditregels die over die persoon gaan verdwijnen allemaal.
- Een heel bedrijf kan op verzoek worden gewist. Dat verwijdert elke gebruiker, vestiging, afdeling, examenuitslag, certificaat, melding en auditregel, samen met de accounts bij onze inlogprovider en het klantrecord bij Stripe.
- Een gecontroleerd verzoek tot wissen ronden we binnen 30 dagen af, en normaal binnen vijf werkdagen.
- Certificaatgegevens blijven vijf jaar na uitgifte staan zodat een bedrijf een inspecteur zijn historie kan laten zien, tenzij er eerder om wissen wordt gevraagd.
Certificeringen
We hebben geen ISO 27001-certificering en geen SOC 2-rapport, en geen derde partij heeft deze maatregelen geauditeerd. Wat op deze pagina staat zit in het product en is daaraan te toetsen. Vraagt uw beoordeling om een gecertificeerde leverancier, zeg dat dan vroeg, dan zeggen we u eerlijk of we daaraan kunnen voldoen.
Een kwetsbaarheid melden
Mail naar privacy@haccphyve.com met wat u deed en wat u zag. We bevestigen ontvangst binnen twee werkdagen.
- Vertel het eerst aan ons en geef ons tijd om het te verhelpen voordat u het aan anderen vertelt.
- Draai geen geautomatiseerde scans op de live site, en lees, verander of bewaar geen gegevens van anderen.
- We ondernemen niets tegen wie die twee punten in goed vertrouwen volgt.
Bijbehorende documenten
IT-teams die een formele beoordeling doen kunnen ons ingevulde beveiligingsvragenlijst opvragen via privacy@haccphyve.com.
