Aller au contenu

08 · Sécurité

Sécurité du site

Comment ce site est construit pour être sûr — et une petite démonstration de ce que j’applique aux produits de mes clients.

Ce site est un petit produit : il est traité comme tel. Des réglages sûrs par défaut, des choix écrits, et rien de chargé que je ne contrôle pas.

En-têtes HTTP#

En-tête Valeur Pourquoi
Content-Security-Policy script-src 'self' 'nonce-…' 'strict-dynamic' Un nonce neuf à chaque réponse ; ni unsafe-inline ni unsafe-eval pour les scripts.
frame-ancestors 'none', base-uri 'none', object-src 'none' Pas d’intégration en iframe, pas de détournement de <base>, pas de plugins.
Strict-Transport-Security max-age=63072000; includeSubDomains; preload HTTPS uniquement, pendant deux ans.
X-Content-Type-Options nosniff Les fichiers sont servis pour ce qu’ils sont.
Referrer-Policy strict-origin-when-cross-origin Les autres sites voient l’origine, jamais le chemin.
Permissions-Policy caméra, micro, géolocalisation, paiement… désactivés Le site n’en utilise aucun.
Cross-Origin-Opener-Policy same-origin Isole le contexte de navigation.

Une réserve, en toute transparence : style-src-attr 'unsafe-inline' est autorisé, car la coloration syntaxique et quelques composants produisent des attributs style. Un attribut de style ne peut pas exécuter de script ; les éléments <style> et <script> en ligne exigent toujours le nonce.

Aucun tiers#

  • Les polices sont auto-hébergées (téléchargées au build). Aucune requête vers Google Fonts.
  • Pas d’analytics par défaut, aucun traceur, aucun widget embarqué. Si des statistiques sont un jour activées, ce sera un outil sans cookie (Plausible) — et cette page le dira.
  • Les visiteurs ne reçoivent aucun cookie. Le seul cookie est la session du back-office, sur mon propre compte.

Formulaires#

  • Les formulaires de contact et de réservation sont validés côté serveur (schémas), limités en débit par IP, protégés par un honeypot et un délai minimal — sans CAPTCHA tiers.
  • Le formulaire de contact n’envoie jamais de réponse automatique : il ne peut pas servir à envoyer des e-mails à des adresses arbitraires.
  • Les adresses IP ne sont jamais stockées en clair : seulement une empreinte salée, suffisante pour repérer un abus.

Back-office#

  • Mots de passe hachés avec scrypt ; comparaison à temps constant ; même coût de calcul que le compte existe ou non.
  • Session dans un cookie HttpOnly, Secure, SameSite=Strict, signé en HMAC-SHA256, valable 12 heures. Changer de mot de passe révoque toutes les autres sessions.
  • Les requêtes qui modifient l’état sont vérifiées via Origin et Sec-Fetch-Site.
  • Chaque connexion, tentative échouée et modification de contenu est inscrite dans un journal d’audit.
  • Les images envoyées sont ré-encodées (métadonnées supprimées) ; les PDF ne sont acceptés que sur leur signature ; le SVG est refusé.

Dépendances#

Minimales et auditées : pnpm audit passe avant chaque mise en production. Dernier audit, 8 octobre 2026 : deux alertes de sévérité haute (braces, node-forge), toutes deux dans l’outillage de build et du serveur de dev — aucune n’est embarquée dans le serveur de production — et sans version corrigée publiée à ce jour.

Divulgation responsable {#disclosure}#

Vous avez trouvé une faille ? Écrivez-moi (adresse dans security.txt). J’accuse réception sous 72 heures et je vous crédite ici si vous le souhaitez. Merci de ne pas lancer de scanners automatiques contre les formulaires de réservation ou de contact.