Zum Inhalt springen / Skip to content

Sécurité chez Wavor

Les données de votre entreprise méritent la même protection qu'une banque. Nous ne vous disons pas seulement CE que nous protégeons. Nous vous montrons COMMENT.

AES-256TLS 1.32FADSGVO/GDPRUK GDPRLGPD (BR)DPDP (IN)Serveurs de l'UE

Sécurité de base

Chiffrement AES-256
Les champs sensibles sont stockés de manière chiffrée. Lus sans la clé, ils ne montrent rien.
Centres de données de l'UE (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.

Disponibilité & Infrastructure

99.9%
Objectif de disponibilité
6h
Intervalle de sauvegarde
90d
Longest retention
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.

Architecture de sécurité

Comment vos données circulent. De la demande au stockage

ÉTAPE 1
Cloudflare Edge
Protection DDoS, WAF, TLS 1.3 avec retour à 1.2. Réseau anycast mondial.
ÉTAPE 2
Cloudflare Tunnel
Origine physiquement inaccessible. Connexion sortante uniquement vers CF, aucun port entrant. Confiance personnalisée AOP uniquement avec certificat Wavor RSA-4096.
ÉTAPE 3
Application Node.js
Validation de session, vérification 2FA, RBAC, validation des entrées via des schémas Zod.
ÉTAPE 4
PostgreSQL + Vault
Encrypted storage with AES-256. Secrets in HashiCorp Vault.
TLS 1.3 (1.2 Fallback)
HTTPS strict complet sur les 7 domaines.
Protection DDoS
Protection en bordure avant que le serveur ne voit la demande.
Où les données sont-elles stockées ?
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.
Comment les clés sont-elles sécurisées ?
Toutes les clés API et secrets dans HashiCorp Vault (KV v2, crypté, contrôlé par accès). Avertissement de rotation automatique à 90/180/365 jours. Aucun secret en texte clair dans le code, env ou logs.
Comment fonctionne la sauvegarde ?
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.

Couches de défense

En-têtes de sécurité HTTP : 14 directives renforcées

CSP Level 3 (21 Direktiven)
Mode d'application. Norme W3C maximale incl. script-src-elem/-attr granulaire, Trusted-Types sur le sous-domaine admin, liste blanche manifest/worker/media-src.
HSTS (Strict-Transport-Security)
max-age 1 an, includeSubDomains, preload activé.
X-Frame-Options
REFUSER. Pas de clickjacking via iframes.
X-Content-Type-Options
nosniff. Les navigateurs ne peuvent pas mal interpréter les types MIME.
Referrer-Policy
strict-origin-when-cross-origin.
Permissions-Policy
Caméra, microphone, géolocalisation. Tous désactivés par défaut.
COOP (Cross-Origin-Opener-Policy)
same-origin. Isole le contexte de navigation.
CORP (Cross-Origin-Resource-Policy)
same-site. Les ressources ne peuvent pas être intégrées d'un autre domaine.

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)

Sécurité du compte

2FA : TOTP / SMS / Email
Trois méthodes pour le deuxième facteur. Codes de secours à usage unique.
Reconnaissance de l'appareil
Notification instantanée sur les nouveaux appareils par email avec IP + User-Agent.
Gestion des sessions
Voir les sessions actives, terminer individuellement ou se déconnecter toutes en même temps.
Protection contre les attaques par force brute (3 couches)
5 échecs par email / verrouillage de 15 minutes. 10 par IP / 1h. 5 emails distincts d'une seule IP / interdiction de 24h.
Cloudflare Turnstile Captcha
Protection contre les bots sans puzzle de clic. Script chargé avec crossOrigin anonyme + no-referrer. Pas de fuite de session vers Cloudflare.
Hachage de mot de passe Bcrypt (coût 12)
Chaque tentative coûte du temps de calcul, ce qui rend les attaques par liste inabordables. Mots de passe >= 12 caractères, vérification de la force zxcvbn.
Validation des entrées Zod
Toutes les entrées API validées côté serveur via Zod. Drizzle-Zod comme source unique de vérité avec schéma DB.
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.

Contrôles avancés

RBAC granulaire (fermé par défaut)
Connaissance du rôle + méthode HTTP : GET nécessite une vue, POST/PATCH nécessite une modification, DELETE nécessite une suppression. Permission manquante = 403, jamais contournée.
Isolation multi-locataire
portée companyId sur chaque requête DB. Pas de fuite de données entre les locataires.
Journaux d'audit
Chaque mutation enregistrée via eventLog + AuditLogger. Piste immuable avec userId, companyId, action, entité.
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.
Politique de rotation des secrets
Avertissement automatique à 90/180/365 jours via secretRotation.ts.
Masquage des PII dans les réponses
Email, IBAN, téléphone masqués pour les membres de l'équipe sans accès aux PII. piiMasking.ts central.
Nettoyage des logs
Tous les journaux sont nettoyés de manière centralisée. Aucune PII dans les journaux, la surveillance ou la sortie de débogage.
Clés API avec portées
Permissions granulaires avec expiration via apiKeyAuth.ts.
Suppression douce et récupération
Récupération de 28 jours des données supprimées. colonne deletedAt avec filtre de requête automatique.
Data export
Exportation JSON complète de toutes les données utilisateur en une seule demande. Suppression via le flux DSAR (Art. 17).

Protection des données

Concrete technical measures

Chiffrement au niveau des champs (AES-256-GCM)
IBAN, numéro fiscal, sécurité sociale, détails bancaires, secrets 2FA TOTP et codes à usage unique (connexion/vérification/réinitialisation) : AES-256-GCM avec IV de 96 bits, tag d'authentification de 128 bits. IV aléatoire par chiffrement.
Chiffrement fermé par défaut
Sans ENCRYPTION_KEY en production : le serveur refuse de démarrer. Pas de retour en texte clair (GDPR Art. 32 lit. a).
Détection de falsification (GCM)
Le tag d'authentification AES-GCM détecte toute falsification de texte chiffré. La décryption échoue durement. Jamais d'acceptation silencieuse.
Hachages de recherche HMAC-SHA256
Les champs chiffrés restent recherchables via HMAC déterministe. Clé séparée (Séparation des clés selon NIST SP 800-57).
Gestion des clés Vault
ENCRYPTION_KEY + SESSION_SECRET + toutes les clés API dans HashiCorp Vault (KV v2). Pas de texte clair dans le code, env ou logs.
Versionnage des clés pour rotation
Format de texte chiffré v1:iv:data:tag. Rotatable à une nouvelle version sans perte de données.

Sécurité de la chaîne d'approvisionnement

Protection contre les dépendances compromises (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.
Alertes Dependabot
GitHub Dependabot vérifie quotidiennement contre la base de données CVE. PRs de sécurité automatiques.
Fichier de verrouillage engagé
package-lock.json dans le dépôt. Empêche CI de tirer des versions différentes de celles locales.
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.
Mises à jour de sécurité automatiques
unattended-upgrades installs operating-system security fixes automatically.
Scripts externes : CORS + Référent
Turnstile (Cloudflare) chargé avec crossOrigin anonyme + referrerPolicy no-referrer. Pas de fuite de crédentiel.

Surveillance & Observabilité

Suivi des erreurs (auto-hébergé)
Alertes d'erreur en temps réel avec des traces de pile.
Métriques (Prometheus + Grafana)
Latence des requêtes, requêtes DB, mémoire, métriques commerciales personnalisées.
Surveillance des serveurs
Uptime, CPU, mémoire, disque : vérifications automatisées 24/7.

Sécurité de téléchargement de fichiers (pile à 7 couches)

Protection contre les logiciels malveillants, les attaques polyglottes, SVG-XSS, le chemin de traversée, le sniffing MIME

Couche 1 : Limite de taille absolue (100 Mo)
Plafond strict contre les bombes zip + DoS. Multer + défense en profondeur.
Couche 2 : Limite de taille par type
Images 5 Mo, PDF 20 Mo, vidéo 100 Mo. Limites spécifiques au type.
Couche 3 : Liste blanche + liste noire MIME
22 types autorisés. HTML/JS/EXE/SH/JAR explicitement bloqués (vecteurs XSS).
Couche 4 : Assainissement des noms de fichiers
Parcours de chemin (../), octet nul, noms réservés Windows bloqués.
Couche 5 : Validation des octets magiques
Le contenu du fichier DOIT correspondre à l'extension + MIME. La bibliothèque de types de fichiers détecte les attaques 'evil.exe renommé picture.jpg'.
Couche 6 : Assainissement des SVG
DOMPurify supprime les balises <script> intégrées des SVG. Sans désinfection, le téléchargement de SVG est un vecteur XSS courant.
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.

Défense XSS en profondeur (4 couches)

XSS stocké, réfléchi, DOM, chaîne d'approvisionnement. Tous les vecteurs couverts

Couche 1 : Échappement automatique de React JSX
Toutes les entrées utilisateur sont échappées par défaut. Les balises <script> sont rendues en tant que texte, jamais exécutées. Règle de code : ne jamais utiliser dangerouslySetInnerHTML avec des entrées utilisateur.
Couche 2 : Désinfectant DOMPurify
sanitizeProse() + sanitizeEmailPreview() nettoient l'HTML des articles, les aperçus d'e-mail + markdown. Supprime <script>, <iframe>, les gestionnaires on* et les URI javascript:/data:.
Couche 3 : CSP script-src 'self'
Même si les couches 1+2 échouent : le navigateur bloque les scripts étrangers. Liste blanche uniquement pour Stripe + Turnstile captcha.
Couche 4 : Trusted-Types (Admin)
require-trusted-types-for 'script' sur admin.wavor.io force chaque manipulation DOM à passer par une politique. Empêche les bugs de bibliothèque de causer des DOM-XSS.

Feuille de route de certification

Nous sommes transparents : Nous sommes en cours de construction et n'avons pas encore de certifications formelles. Mais nous mettons déjà en œuvre les normes et travaillons activement à leur réalisation.

DSGVO / GDPR (EU)
Mis en œuvre
UK GDPR (Data Protection Act 2018)
Mis en œuvre
LGPD (Brasilien)
Mis en œuvre
DPDP Act 2023 (Indien)
Mis en œuvre
AVG (Niederlande)
Mis en œuvre
FADP (Schweiz)
Mis en œuvre
ePrivacy (Cookie-Consent)
Mis en œuvre
DSA (Digital Services Act)
Mis en œuvre
SOC 2 Type II
Prévu
ISO 27001:2022
Prévu
ISO 27017 + 27018 (Cloud)
Prévu
ISO 27701 (Privacy)
Prévu
ISO 42001 (AI Management)
Prévu
BSI C5 Type II
Prévu
CSA STAR Level 1
Prévu

Nous nous alignons également sur la loi AI de l'UE, NIS2 et GoBD (comptabilité allemande). Ce sont des réglementations, pas des certifications.

Signaler un problème de sécurité

Vous avez trouvé une vulnérabilité ? Signalez-la de manière confidentielle à notre équipe. Nous prenons chaque rapport au sérieux et nous vous répondrons dès que possible.