Colophon
Ce site est sa propre démonstration
Pas un portfolio qui dit faire de l'ingénierie respectueuse de la vie privée : un qui la montre, et qui vous laisse vérifier chaque affirmation depuis votre navigateur. Voici comment il est fait, et pourquoi.
1. Un virtualhost dédié
Ce site n'est pas une page greffée sur le blog : il tourne sur un vhost séparé (portfolio.gabrielesalati.eu), avec ses propres en-têtes et sa propre Content-Security-Policy. Séparer les responsabilités permet de durcir cette zone sans contraindre le reste — et de le raconter avec précision.
www.gabrielesalati.eu et ce domaine répondent avec des configurations différentes. Deux server blocks distincts.
2. CSP «JS-aware» : aucun script inline
La policy est script-src 'self' sans 'unsafe-inline' ni 'unsafe-eval'. Conséquence concrète : aucun <script> inline, aucun onclick= dans le HTML. Tout le JavaScript vit dans un fichier externe auto-hébergé, en pure amélioration progressive. Ce n'est pas une contrainte subie : c'est la discipline qui ferme des classes entières de XSS.
/assets/js/portfolio.js, servi par ce domaine.
3. Zéro tiers
Pas de CDN, pas de Google Fonts, pas d'analytics, pas de cookies, pas de beacon. Les polices sont la pile système : zéro fonte téléchargée, rien à pister. La seule requête réseau que le JavaScript peut faire vise cette même origine.
Vérifiez : DevTools → « Réseau », rechargez. Comptez les domaines : il n'y en a qu'un. Le widget ci-dessous vous le confirme tout seul.4. TLS 1.3, sans courbes NIST
Uniquement TLS 1.3. Échange de clés en X25519 (pas de courbes NIST), chiffrements ChaCha20-Poly1305 et AES-GCM. Certificat Let's Encrypt géré en interne, aucun terminateur TLS tiers, aucun Cloudflare en façade.
Vérifiez :openssl s_client -connect portfolio.gabrielesalati.eu:443 -tls1_2 doit échouer. Seul 1.3 répond.
5. Durcissement HTTP complet
Chaque réponse porte : HSTS, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer, une Permissions-Policy qui coupe caméra, micro et géolocalisation, X-Frame-Options: DENY et les policies Cross-Origin. Pas des mots : des en-têtes que votre navigateur applique.
curl -sI https://portfolio.gabrielesalati.eu/.
6. Fonctionne aussi sans JavaScript
Désactivez le JS : le site reste entier et lisible. Le JavaScript n'ajoute que la vérification interactive ci-dessous — une amélioration, jamais un prérequis.
Ne me croyez pas — vérifiez
Cette vérification tourne entièrement dans votre navigateur, avec le seul script de ce domaine : elle télécharge les en-têtes de cette page et les affiche ici.