Sécurité
Comment on protège vos données, vos tenants et vos votants, by construction.
Dernière mise à jour
# Données hébergées en UE
Toutes les données utilisateurs d'Upvoted sont stockées exclusivement dans l'Union européenne. C'est un engagement structurel, pas une option configurable.
- Base de données principale : PostgreSQL 17 hébergé sur Neon, région
eu-central-1(Frankfurt, Allemagne). - CDN et frontend : Cloudflare Pages avec routage prioritaire EU.
- Stockage de fichiers (logos, exports CSV) : Cloudflare R2, juridiction EU.
- Sauvegardes : object storage situé en EU, rétention 30 jours.
Aucun transfert de données utilisateur en dehors de l'EU n'est effectué dans le cadre du fonctionnement nominal du service.
# Chiffrement
En transit : tout le trafic entre les navigateurs, le widget embed, l'API et la base de données utilise TLS 1.2 minimum (TLS 1.3 préféré). HSTS preloaded sur upvoted.pro.
Au repos : toutes les bases PostgreSQL et les volumes de stockage sont chiffrés au niveau disque (AES-256) par les hébergeurs (Neon, Cloudflare R2).
Mots de passe : hashage bcrypt avec coût 12 (~250 ms par hash). Aucun mot de passe n'est jamais stocké en clair, ni loggué, ni transmis aux sous-traitants.
Tokens : les tokens opaques (vérification d'email, refresh tokens) sont stockés sous forme de hash SHA-256 ; l'original n'existe que côté utilisateur (cookie httpOnly ou lien email).
# Authentification
Administrateurs : authentification par email + mot de passe (bcrypt cost 12, minimum 10 caractères) avec session JWT à TTL court (1h) et refresh token rotatif (7 jours, cookie httpOnly Secure SameSite=Strict).
Votants : authentification par lien magique uniquement, jamais de mot de passe. Le lien expire après 24h, est usage unique, et limité à un seul vote ou commentaire.
SSO / SAML : prévu pour le plan Business (V3) avec support des fournisseurs Okta, Google Workspace et Microsoft Entra.
Limitation de débit : 5 demandes de lien magique par IP/minute, 10 liens par email/heure, ainsi qu'un fingerprint IP+UA pour la détection d'abus.
# Isolation multi-tenant
Upvoted utilise une isolation à deux couches indépendantes pour empêcher toute fuite de données entre tenants :
- Couche applicative : chaque requête est routée par un middleware qui résout le
tenant_idà partir du JWT (côté admin) ou du Host header (côté public). Letenant_idn'est jamais accepté depuis le corps d'une requête client. - Couche base de données : chaque table contenant des données de tenant est protégée par une politique Row-Level Security (RLS) PostgreSQL appliquée même au niveau du propriétaire de la table (FORCE ROW LEVEL SECURITY). Une session ne peut accéder qu'aux lignes correspondant à son
tenant_id.
Une erreur unique sur l'une des deux couches ne suffit pas à provoquer une fuite. Un test d'intégration vérifie en continu qu'une session du tenant A retourne zéro ligne quand elle interroge les données du tenant B.
# Sous-traitants
Upvoted s'appuie sur les sous-traitants suivants pour fournir le service. La liste à jour est disponible sur demande à [email protected].
- Stripe Inc. (Irlande), paiements, facturation, calcul de TVA EU. Aucune donnée de carte bancaire n'est stockée par Upvoted.
- Resend (États-Unis, région EU sélectionnée), emails transactionnels (vérification, réinitialisation, notifications).
- PostHog EU (Allemagne), analytics produit et feature flags.
- Cloudflare (États-Unis, edge EU), CDN, DNS, protection DDoS, Cloudflare for SaaS pour les domaines personnalisés (V2).
- Neon (États-Unis, région
eu-central-1), base de données PostgreSQL.
Tous les sous-traitants ont signé un Data Processing Agreement (DPA) couvrant la protection des données personnelles dans le cadre du RGPD.
# Sauvegardes & PRA
Sauvegardes complètes quotidiennes du PostgreSQL avec rétention 30 jours, plus une point-in-time recovery sur 7 jours via les WAL. Objectifs de reprise :
- RPO (point de reprise) : moins de 15 minutes
- RTO (temps de reprise) : moins de 4 heures
Les sauvegardes sont stockées sur object storage chiffré (AES-256) en EU et leur restoration est testée trimestriellement.
# Gestion des incidents
En cas d'incident de sécurité affectant des données personnelles, Ekklo SAS s'engage à :
- Notifier la CNIL dans un délai de 72 heures conformément à l'article 33 du RGPD
- Notifier les utilisateurs concernés sans délai déraisonnable lorsque l'incident présente un risque élevé
- Publier un post-mortem public sur upvoted.pro/blog dans les 30 jours suivants
Statut en temps réel disponible sur status.upvoted.pro.
# Signaler une vulnérabilité
Si vous découvrez une vulnérabilité de sécurité, signalez-la-nous à [email protected]. Nous accusons réception sous 48h ouvrées et nous engageons à corriger les failles critiques dans les meilleurs délais.
Un programme de bug bounty formel sera mis en place en V2. En attendant, nous reconnaissons publiquement les contributions sur cette page.