1. Wachtwoorden en inloggen
- Wachtwoorden worden nooit in leesbare vorm opgeslagen. We gebruiken Argon2id (de huidige industrie-standaard, winnaar van de Password Hashing Competition) met bcrypt als fallback.
- Twee-staps-verificatie (2FA) via een authenticator-app is verplicht voor beheerders en eigenaren, en aanbevolen voor alle gebruikers.
- We bieden eenmalig bruikbare recovery-codes aan voor wanneer je je telefoon kwijt bent.
- Brute-force bescherming: na 5 mislukte pogingen wordt het inlog-IP-adres tijdelijk gelimiteerd; na 10 pogingen wordt het account vergrendeld.
2. Versleuteling
- Onderweg: HTTPS-only met TLS 1.2 of hoger, HSTS preload, geen oude cipher suites.
- Bij opslag: gevoelige velden (IBAN, BTW-id, 2FA-secret, recovery-code hashes) worden versleuteld met AES-256-CBC + HMAC-SHA-256 via de defuse/php-encryption library. De sleutel staat in een omgevingsvariabele, niet in code of database.
- Backups: dagelijks versleuteld weggeschreven naar een offsite locatie, retentie 30 dagen rolling + 12 maanden maandelijks.
3. Sessies en cookies
- Sessie-cookies hebben
HttpOnly,Secure,SameSite=Stricten in productie het__Host--prefix. - Sessie-ID's worden geregenereerd bij login en bij rol-wijziging om sessie-fixation te voorkomen.
- Sessies verlopen na 30 minuten inactiviteit en absoluut na 8 uur.
- Geen tracking- of advertentiecookies — alleen functionele cookies voor inloggen.
4. Tegen veelvoorkomende aanvallen
- SQL-injectie: alle database-query's gebruiken geparametriseerde prepared statements. Geen string-concatenatie met user-input.
- XSS: alle output in templates wordt geëscaped via de centrale
e()-helper. - CSRF: elke wijzigende aanroep (POST/PUT/DELETE) vereist een geldige CSRF-token. Tokens roteren bij login.
- Clickjacking:
X-Frame-Options: DENYenframe-ancestors 'none'in CSP. - Strikte CSP:
default-src 'self', geen inline scripts, geen externe CDN's.
5. Administratieve maatregelen
- Audit-log: elke create/update/delete op facturen, journaalposten, gebruikersrollen en BTW-aangiftes wordt vastgelegd met wie/wanneer/wat (voor- en na-staat). De log is alleen-toevoegen (append-only).
- Onveranderlijkheid: zodra een factuur is verzonden of een bonnetje is verwerkt, is wijzigen niet meer mogelijk — alleen een correctie via creditfactuur of memoriaal.
- Rol-gebaseerde toegang: Eigenaar, Boekhouder en Kijker. Alleen eigenaren kunnen gebruikersbeheer doen.
- Multi-tenant isolatie: elke database-query is gebonden aan een tenant_id. Onmogelijk per ongeluk andermans data te zien.
6. Infrastructuur
- Server staat in Nederland bij een Plesk-gehoste VPS-provider.
- PHP 8.4 + MariaDB 10.11 op Apache met PHP-FPM (exclusieve toepassing — geen shared hosting).
- Firewall sluit alle poorten behalve 80/443; SSH alleen via key-auth op een niet-standaard poort; fail2ban actief.
- Wekelijkse OS-updates, security-patches binnen 7 dagen na uitgifte.
- Dependencies worden gemonitord met
composer auditennpm auditin CI/CD.
7. Verantwoorde openbaarmaking (responsible disclosure)
Heb je een beveiligingslek ontdekt? Neem dan contact op via security@executie.nl. We reageren binnen 5 werkdagen, lossen serieuze issues binnen 30 dagen op en vermelden je graag in onze hall-of-fame als je dat wilt. We doen geen aangifte bij melders die zich aan de gangbare disclosure-richtlijnen houden (geen data exfiltreren, geen systemen verstoren, geen DDoS).
8. Naleving en certificering
We werken volgens de OWASP ASVS Level 2+ standaard en de richtlijnen van het NCSC. Formele certificering (ISO 27001) is niet (nog) van toepassing op deze schaal, maar de relevante maatregelen zijn wel geïmplementeerd. Voor enterprise-klanten die hier behoefte aan hebben: neem contact op.
9. Bij een datalek
Mocht er ondanks alle maatregelen toch iets fout gaan en jouw gegevens in gevaar komen, dan informeren we je binnen 72 uur per e-mail en melden we het lek waar nodig bij de Autoriteit Persoonsgegevens, conform AVG artikel 33.