Beveiliging bij Wavor Je bedrijfsgegevens verdienen dezelfde bescherming als een bank. We vertellen je niet alleen WAT we beschermen. We laten je ZIEN HOE.
AES-256 TLS 1.3 2FA DSGVO/GDPR UK GDPR LGPD (BR) DPDP (IN) EU-servers
AES-256 Versleuteling
Sensitive fields are stored encrypted. Read without the key, they show nothing.
EU-datacenters (Hetzner DE)
Servers and customer files in Germany. Offsite backups sit encrypted outside the EU under the EU's transfer safeguards; the privacy policy names the provider.
Nerd zone It gets technical from here. You do not need to read any of it to use Wavor safely - it is here so it can be checked.
Beveiligingsarchitectuur Hoe je gegevens stromen. Van aanvraag tot opslag
STAP 1
Cloudflare Edge
DDoS-bescherming, WAF, TLS 1.3 met 1.2 fallback. Wereldwijd anycast-netwerk.
STAP 2
Cloudflare Tunnel
Oorsprong fysiek onbereikbaar. Alleen uitgaande verbinding naar CF, geen inkomende poort. AOP Custom-only Trust met Wavor RSA-4096 certificaat.
STAP 3
Node.js App
Sessievalidatie, 2FA-controle, RBAC, invoervalidatie via Zod-schema's.
STAP 4
PostgreSQL + Vault
Encrypted storage with AES-256. Secrets in HashiCorp Vault.
TLS 1.3 (1.2 Fallback)
Volledige Strikte HTTPS op alle 7 domeinen.
DDoS-bescherming
Randbescherming voordat de server de aanvraag ziet.
Waar worden gegevens opgeslagen?
The servers are at Hetzner in Germany (Falkenstein and Nuremberg), customer files in object storage in Germany. The data centres are guarded around the clock, with biometric access. Backups and some services such as email, SMS and AI run through providers outside the EU. Those transfers are secured under the EU's rules, and the privacy policy names every provider.
Hoe worden sleutels beveiligd?
Alle API-sleutels en geheimen in HashiCorp Vault (KV v2, versleuteld, toegangscontrole). Automatische rotatiewaarschuwing bij 90/180/365 dagen. Geen platte tekst geheimen in code, env of logs.
Hoe werkt back-up?
Automated PostgreSQL backups every 6 hours. Kept: every one for two days, one a day up to 14 days, one a week up to 90 days. Each is decrypted again and checked after encryption, and every night the newest is restored as a test. Offsite copy at Backblaze, encrypted with our own key before it leaves the server.
Verdedigingslagen HTTP-beveiligingsheaders: 14 versterkte richtlijnen
CSP Level 3 (21 Direktiven)
Afgedwongen modus. Maximale W3C-standaard incl. script-src-elem/-attr granular, Trusted-Types op admin subdomein, manifest/worker/media-src whitelist.
HSTS (Strict-Transport-Security)
max-age 1 year, includeSubDomains, preload enabled.
X-Frame-Options
WEIGEREN. Geen clickjacking via iframes.
X-Content-Type-Options
nosniff. Browsers kunnen MIME-typen niet verkeerd interpreteren.
Referrer-Policy
strict-origin-when-cross-origin.
Permissions-Policy
Camera, microfoon, geolocatie. Alle standaard uitgeschakeld.
COOP (Cross-Origin-Opener-Policy)
same-origin. Isolates browsing context.
CORP (Cross-Origin-Resource-Policy)
same-site. Hulpbronnen kunnen niet cross-origin worden ingesloten.
Independently verifiable: Mozilla's HTTP Observatory grades the headers of wavor.io A+. A test asks Mozilla for the result again every night. https://developer.mozilla.org/en-US/observatory/analyze?host=wavor.io(developer.mozilla.org)
2FA: TOTP / SMS / E-mail
Drie methoden voor de tweede factor. Back-upcodes voor eenmalig gebruik.
Apparaatherkenning
Directe melding op nieuwe apparaten via e-mail met IP + User-Agent.
Sessiebeheer
Bekijk actieve sessies, beëindig individueel of log allemaal tegelijk uit.
Brute-Force Bescherming (3 lagen)
5 mislukkingen per e-mail / 15 minuten blokkering. 10 per IP / 1 uur. 5 verschillende e-mails van één IP / 24 uur ban.
Cloudflare Turnstile Captcha
Botbescherming zonder klikpuzzel. Script geladen met crossOrigin anoniem + no-referrer. Geen sessielek naar Cloudflare.
Bcrypt Wachtwoord Hashing (kost 12)
Every guess costs computing time, which makes list attacks unaffordable. Passwords >= 12 chars, zxcvbn strength check.
Zod Invoer Validatie
Alle API-invoer gevalideerd serverzijde via Zod. Drizzle-Zod als enkele bron van waarheid met DB-schema.
Rate limiting with a sliding window
A sliding window rather than fixed blocks, so a limit is not handed out afresh at the top of every minute. The counter currently lives in the individual worker process; once Redis is configured, all processes share one.
Fijnmazige RBAC (fail-closed)
Rol + HTTP-methode bewust: GET heeft weergave nodig, POST/PATCH heeft bewerking nodig, DELETE heeft verwijdering nodig. Ontbrekende toestemming = 403, nooit omzeilen.
Multi-Tenant Isolatie
companyId-scope op elke DB-query. Geen datalek tussen huurders.
Auditlogs
Elke mutatie gelogd via eventLog + AuditLogger. Onveranderlijk spoor met userId, companyId, actie, entiteit.
Approval by two people
Four actions need two approvals: changes to legal values, prices and terms, and a new sub-processor. While only one person is authorised, that person decides alone. The rule takes effect once there is a second.
Beleid voor geheimrotatie
Automatische waarschuwing bij 90/180/365 dagen via secretRotation.ts.
PII Maskering in Antwoorden
E-mail, IBAN, telefoon gemaskeerd voor teamleden zonder PII-toegang. piiMasking.ts centraal.
Log Scrubbing
All logs are centrally scrubbed. Zero PII in logs, monitoring or debug output.
API-sleutels met scopes
Fijnmazige machtigingen met vervaldatum via apiKeyAuth.ts.
Zachte verwijdering & Herstel
28-dagen herstel van verwijderde gegevens. deletedAt kolom met automatische queryfilter.
Data export
Volledige JSON-export van alle gebruikersgegevens in één verzoek. Verwijdering via DSAR-flow (Art. 17).
Gegevensbescherming Concrete technical measures
Veldniveau Versleuteling (AES-256-GCM)
IBAN, belasting-ID, sociale zekerheid, bankgegevens, TOTP 2FA geheimen en eenmalige codes (inloggen/validatie/reset): AES-256-GCM met 96-bit IV, 128-bit auth-tag. Willekeurige IV per encryptie.
Fail-closed Versleuteling
Zonder ENCRYPTION_KEY in productie: server weigert te starten. Geen platte tekst fallback (GDPR Art. 32 lit. a).
Manipulatie Detectie (GCM)
AES-GCM auth-tag detecteert elke manipulatie van de ciphertext. Decryptie faalt hard. Nooit stil accepteren.
HMAC-SHA256 Zoek Hashes
Versleutelde velden blijven doorzoekbaar via deterministische HMAC. Gescheiden sleutel (Key-Separation per NIST SP 800-57).
Vault Sleutelbeheer
ENCRYPTION_KEY + SESSION_SECRET + alle API-sleutels in HashiCorp Vault (KV v2). Geen platte tekst in code, env of logs.
Sleutelversiebeheer voor Rotatie
Ciphertext formaat v1:iv:data:tag. Rotatable naar nieuwe versie zonder gegevensverlies.
Leveringsketenbeveiliging Bescherming tegen gecompromitteerde afhankelijkheden (event-stream 2018, ua-parser-js 2021)
Dependencies as a build gate
Every build checks all dependencies against the vulnerability database. New findings block; known ones sit in a dated baseline that may only shrink.
Dependabot Meldingen
GitHub Dependabot controleert dagelijks tegen CVE-database. Automatische beveiligings-PR's.
Lockfile gecommitteerd
package-lock.json in repo. Voorkomt dat CI verschillende versies ophaalt dan lokaal.
SSRF protection on outbound fetches
Every address that comes from user input is checked before Wavor fetches it. Private networks are blocked, and each redirect is checked again instead of being followed blindly.
Automatische Beveiligingspatches
unattended-upgrades installs operating-system security fixes automatically.
Externe Scripts: CORS + Verwijzer
Turnstile (Cloudflare) geladen met crossOrigin anoniem + referrerPolicy no-referrer. Geen credential lek.
Monitoring & Observability Error Tracking (self-hosted)
Realtime foutmeldingen met stacktraces.
Statistieken (Prometheus + Grafana)
Verzoeklatentie, DB-queries, geheugen, aangepaste bedrijfsstatistieken.
Server Monitoring
Uptime, CPU, geheugen, schijf: 24/7 geautomatiseerde controles.
Bestand-upload Beveiliging (7-Lagen Stack) Bescherming tegen malware, polyglot aanvallen, SVG-XSS, pad-traversal, MIME-sniffing
Laag 1: Absolute Grootte Poort (100 MB)
Harde limiet tegen zip-bommen + DoS. Multer + verdediging-in-diepte.
Laag 2: Per-Type Grootte Poort
Afbeeldingen 5 MB, PDF 20 MB, video 100 MB. Type-specifieke limieten.
Laag 3: MIME Whitelist + Blocklist
22 types toegestaan. HTML/JS/EXE/SH/JAR expliciet geblokkeerd (XSS-vectors).
Laag 4: Bestandsnaam Sanitization
Pad-traversal (../), null-byte, Windows-gereserveerde namen geblokkeerd.
Laag 5: Magic-Byte Validatie
Bestandsinhoud MOET overeenkomen met extensie + MIME. Bestands-type bibliotheek detecteert 'evil.exe hernoemde picture.jpg' aanvallen.
Laag 6: SVG Sanitization
DOMPurify verwijdert ingesloten <script> tags uit SVG's. Zonder sanitisatie is SVG-upload een veelvoorkomende XSS-vector.
Layer 7: virus scan
Server-side virus scan before storage, provided the scanner is running on the server. If it is missing, that is logged rather than passed over silently.
XSS Verdediging in Diepte (4 Lagen) Opgeslagen, gereflecteerde, DOM, supply-chain XSS. Alle vectors gedekt.
Laag 1: React JSX Auto-Escape
Alle gebruikersinvoer wordt standaard ontsnapt. <script> tags worden weergegeven als tekst, nooit uitgevoerd. Code regel: nooit dangerouslySetInnerHTML met gebruikersinvoer.
Laag 2: DOMPurify Sanitizer
sanitizeProse() + sanitizeEmailPreview() reinigen artikel-HTML, e-mailvoorbeelden + markdown. Verwijdert <script>, <iframe>, on*-handlers, javascript:/data: URI's.
Laag 3: CSP script-src 'self'
Zelfs als lagen 1+2 falen: browser blokkeert buitenlandse scripts. Whitelist alleen voor Stripe + Turnstile captcha.
Laag 4: Trusted-Types (Admin)
require-trusted-types-for 'script' op admin.wavor.io dwingt elke DOM-manipulatie via een beleid. Voorkomt dat bibliotheekfouten DOM-XSS veroorzaken.
We zijn transparant: We zijn aan het opbouwen en hebben nog geen formele certificeringen. Maar we implementeren de normen al en werken actief aan de naleving.
DSGVO / GDPR (EU)
Geïmplementeerd UK GDPR (Data Protection Act 2018)
Geïmplementeerd LGPD (Brasilien)
Geïmplementeerd DPDP Act 2023 (Indien)
Geïmplementeerd AVG (Niederlande)
Geïmplementeerd FADP (Schweiz)
Geïmplementeerd ePrivacy (Cookie-Consent)
Geïmplementeerd DSA (Digital Services Act)
Geïmplementeerd
ISO 27017 + 27018 (Cloud)
Gepland
ISO 27701 (Privacy)
Gepland
ISO 42001 (AI Management)
Gepland We stemmen bovendien af op de EU AI-wet, NIS2 en GoBD (Duitse boekhouding). Dit zijn regels, geen certificeringen.
We only work with vetted, certified providers. Each one has been checked for security and data protection.
Hetzner Online GmbH ISO 27001, data centre in Germany
Cloudflare, Inc. SOC 2, ISO 27001
Stripe Payments Europe Ltd. PCI DSS Level 1
Amazon Web Services, Inc. (AWS) ISO 27001, SOC 2
OVH SAS (OVHcloud) ISO 27001, stored in Germany. Encryption at rest by the provider (AES-256).
Backblaze, Inc. SOC 2. Bucket with Object Lock (compliance mode): once written, a backup cannot be deleted before its retention date.
Twilio, Inc. SOC 2, ISO 27001
Mistral AI SAS SOC 2 Type II, ISO 27001/27701, data in the EU
OpenAI LLC SOC 2 Type II, no training on API inputs
OpenProvider B.V. EU-based (Netherlands)
Rapporteer beveiligingsprobleem Een kwetsbaarheid gevonden? Meld het vertrouwelijk aan ons team. We nemen elke melding serieus en nemen zo snel mogelijk contact met je op.
Rapporteren