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.

Vérifiez : le blog sur 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.

Vérifiez : ouvrez les DevTools → onglet « Sources ». Le seul script est /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.

Vérifiez : utilisez le bouton ci-dessous, ou 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.

Voir les projets →