← Accueil

PCTAMALOU

Semaine 8 : Les Voix de la Cité – DNS, HTTP et les Bases du Chiffrement TLS

Par Platon-Y – pctamalou.fr & e-of-h.fr

🎯 Objectif de la semaine

Comprendre DNS, HTTP/HTTPS et TLS pour analyser le trafic web de bout en bout, détecter les communications non sécurisées et identifier les vulnérabilités dans la chaîne de communication Internet.

Pourquoi c'est fondamental : 90% des attaques modernes passent par le web. Comprendre comment le web fonctionne, c'est comprendre comment les attaquants l'exploitent.

flowchart TD A[👤 Utilisateur tape
https://example.com] --> B[🔍 DNS Resolution] subgraph B[DNS Lookup] B1[Cache Local] --> B2[Recursive Resolver] B2 --> B3[Root Servers] B3 --> B4[TLD Servers .com] B4 --> B5[Authoritative Servers] B5 --> B6[142.250.190.78] end B --> C[🌐 TCP Handshake
Port 443] C --> D[🔒 TLS Handshake] subgraph D[TLS 1.2/1.3] D1[Client Hello] --> D2[Server Hello] D2 --> D3[Certificate Exchange] D3 --> D4[Key Exchange] D4 --> D5[Encrypted Session] end D --> E[📡 HTTP/2 ou HTTP/1.1] E --> F[📄 GET / HTTP/1.1
Headers, Cookies] F --> G[✅ 200 OK
HTML, CSS, JS] G --> H[🔄 Rendu Browser] I[🎭 Attaques] --> J[🎯 DNS Spoofing] I --> K[👂 HTTP Sniffing] I --> L[📜 Certificate Spoofing] I --> M[🍪 Session Hijacking] style B fill:#0a0e17,stroke:#00d4ff,stroke-width:2px style D fill:#11151f,stroke:#9d4edd,stroke-width:2px style I fill:#ef4444,stroke:#fff,stroke-width:2px

📚 Sujet – Théorie (1 heure)

DNS : L'annuaire téléphonique d'Internet

📞 Comment fonctionne DNS :

  1. Cache local : Votre ordinateur vérifie d'abord son cache DNS
  2. Résolveur récursif : Votre FAI ou 8.8.8.8 (Google DNS)
  3. Root servers : 13 serveurs racines mondiaux (a.root-servers.net...)
  4. TLD servers : Serveurs de domaine de premier niveau (.com, .org, .fr)
  5. Authoritative servers : Serveurs faisant autorité pour le domaine

Record DNS important :

  • A/AAAA : IPv4/IPv6 address
  • MX : Mail exchange (serveurs email)
  • CNAME : Alias (canonical name)
  • TXT : Text records (SPF, DKIM, DMARC)
  • NS : Name servers (serveurs DNS faisant autorité)

HTTP : Le langage du web (non chiffré)

Méthode HTTP Usage Sécurité Exemple Risques
GET Récupérer des données Dangereux en clair GET /index.html Sniffing, données URL
POST Envoyer des données Très dangereux POST /login Credentials interceptés
PUT Mettre à jour Risquée PUT /api/user/1 Modification non autorisée
DELETE Supprimer Critique DELETE /api/user/1 Destruction données

Codes de statut HTTP : Le langage des serveurs

graph TD A[💬 Codes HTTP] --> B[1xx Informatif] A --> C[2xx Succès] A --> D[3xx Redirection] A --> E[4xx Erreur Client] A --> F[5xx Erreur Serveur] B --> B1[100 Continue] B --> B2[101 Switching Protocols] C --> C1[200 OK] C --> C2[201 Created] C --> C3[204 No Content] D --> D1[301 Moved Permanently] D --> D2[302 Found] D --> D3[304 Not Modified] E --> E1[400 Bad Request] E --> E2[401 Unauthorized] E --> E3[403 Forbidden] E --> E4[404 Not Found] E --> E5[429 Too Many Requests] F --> F1[500 Internal Server Error] F --> F2[502 Bad Gateway] F --> F3[503 Service Unavailable] style C1 fill:#11151f,stroke:#00f5a0,stroke-width:2px style E4 fill:#0a0e17,stroke:#f59e0b,stroke-width:2px style F1 fill:#0a0e17,stroke:#ef4444,stroke-width:2px

TLS : La protection des communications

⚠️ Pourquoi TLS est non négociable :

Sans TLS (HTTPS), toutes les données sont visibles par :

  • Votre FAI
  • Les routeurs sur le chemin
  • Les personnes sur le même réseau WiFi
  • Les attaquants en MITM (Man-in-the-Middle)

Règle du Gardien : "Tout ce qui n'est pas chiffré est public. Tout ce qui est public peut être utilisé contre vous."

Le handshake TLS en 4 étapes clés

🔐 TLS 1.3 simplifié :

Client                                                  Server
  |                                                        |
  |------------------- Client Hello ---------------------->|
  | (Supported versions, cipher suites, extensions)        |
  |                                                        |
  |<------------------ Server Hello -----------------------|
  | (Selected version, cipher suite, certificate)          |
  |                                                        |
  |<--------------- Encrypted Extensions ------------------|
  |                                                        |
  |<------------------- Certificate -----------------------|
  | (Server's public key certificate)                      |
  |                                                        |
  |<--------------- Certificate Verify --------------------|
  | (Proof of private key possession)                      |
  |                                                        |
  |<------------------ Finished ---------------------------|
  | (Encrypted handshake finished)                         |
  |                                                        |
  |-------------------- Finished ------------------------->|
  |                                                        |
  |               Application Data (Encrypted)             |

Éléments critiques :

  • Certificat : Preuve d'identité du serveur (signé par une autorité)
  • Cipher suite : Algorithme de chiffrement négocié (ex: TLS_AES_256_GCM_SHA384)
  • Key exchange : Échange sécurisé de clés (ECDHE, DHE)

Les vulnérabilités de la chaîne web

🔓 Points d'attaque courants :

  1. DNS Poisoning : Redirection vers un faux site
  2. HTTP Sniffing : Interception du trafic non chiffré
  3. Certificate Spoofing : Faux certificats SSL
  4. Mixed Content : HTTPS mais ressources HTTP
  5. HSTS non implémenté : Permet le downgrade HTTPS→HTTP
  6. Weak Cipher Suites : Chiffrement faible (RC4, SSLv3)

💡 Philosophie de la sécurité web :

"Toute communication web doit être :

  1. Chiffrée (HTTPS/TLS)
  2. Authentifiée (certificats valides)
  3. Intègre (pas de modification en transit)
  4. Traçable (logs et monitoring)

Une violation de l'un de ces principes est une faille potentielle."

🔬 Mission pratique – Laboratoire (2 heures)

Scénario : Analyse forensic d'une communication web compromise

Vous devez analyser le trafic web d'une entreprise soupçonnée d'avoir des communications non sécurisées. Votre mission : capturer, analyser et documenter les vulnérabilités.

📝 Préparation : Installez les outils nécessaires.

sudo apt update
sudo apt install -y tcpdump dnsutils curl openssl nmap
# tcpdump: capture réseau
# dnsutils: dig, nslookup
# curl: client HTTP/HTTPS
# openssl: analyse TLS
# nmap: scanning (semaines suivantes)

Étapes détaillées : Analyse complète

  1. Analyse DNS approfondie
    Comprenez la résolution DNS en détail :
    echo "=== ANALYSE DNS COMPLÈTE ==="
    
    # 1. Résolution directe
    echo "1. Résolution A record:"
    dig google.com A +short
    
    echo -e "\n2. Tous les records:"
    dig google.com ANY +noall +answer
    
    echo -e "\n3. Résolution récursive complète:"
    dig google.com +trace
    
    echo -e "\n4. Serveurs DNS faisant autorité:"
    dig google.com NS +short
    
    echo -e "\n5. MX records (email):"
    dig google.com MX +short
    
    echo -e "\n6. Analyse avec nslookup:"
    nslookup -type=any google.com
    
    # 7. Test DNSSEC
    echo -e "\n7. Vérification DNSSEC:"
    dig google.com +dnssec +multi | grep -E "(flags:|RRSIG)"
    
    # Sauvegarde
    dig google.com ANY > dns_analysis.txt
    echo "Analyse DNS sauvegardée dans dns_analysis.txt"
  2. Capture et analyse HTTP avec tcpdump
    Capturez et analysez le trafic HTTP :
    echo "=== CAPTURE TRAFIC HTTP ==="
    
    # Dans le terminal 1 : Lancez la capture
    echo "Terminal 1 - Capture:"
    echo "sudo tcpdump -i any port 80 -A -c 20"
    echo "Ou mieux, sauvegardez dans un fichier:"
    echo "sudo tcpdump -i any port 80 -w http_capture.pcap"
    
    # Dans le terminal 2 : Générez du trafic
    echo -e "\nTerminal 2 - Génération trafic:"
    echo "curl http://httpbin.org/get"
    echo "curl -X POST http://httpbin.org/post -d 'username=test&password=secret'"
    
    read -p "Appuyez sur Entrée quand c'est fait..."
    
    # Analyse de la capture sauvegardée
    echo -e "\n=== ANALYSE CAPTURE PCAP ==="
    sudo tcpdump -r http_capture.pcap -A 2>/dev/null | head -30
    
    # Filtres avancés
    echo -e "\n=== FILTRES TCPDUMP AVANCÉS ==="
    echo "Requêtes POST uniquement:"
    echo "sudo tcpdump -r http_capture.pcap -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354' 2>/dev/null"
    
    echo -e "\nHeaders HTTP:"
    echo "sudo tcpdump -r http_capture.pcap -A 'port 80' 2>/dev/null | grep -E '(GET|POST|Host:|User-Agent:|Cookie:)'"
  3. Analyse HTTP/HTTPS avec curl
    Utilisez curl comme un outil d'analyse :
    echo "=== ANALYSE AVEC CURL ==="
    
    # 1. Headers seulement
    echo "1. Headers HTTP:"
    curl -I http://httpbin.org
    
    # 2. Requête détaillée
    echo -e "\n2. Requête détaillée (verbose):"
    curl -v http://httpbin.org/get
    
    # 3. Test de méthodes HTTP
    echo -e "\n3. Test différentes méthodes:"
    echo "GET:" && curl -X GET http://httpbin.org/get
    echo -e "\nPOST:" && curl -X POST http://httpbin.org/post -d 'test=data'
    echo -e "\nPUT:" && curl -X PUT http://httpbin.org/put -d 'update=data'
    echo -e "\nDELETE:" && curl -X DELETE http://httpbin.org/delete
    
    # 4. Headers personnalisés
    echo -e "\n4. Headers personnalisés:"
    curl -H "User-Agent: PCTAMALOU-Scanner" \
         -H "X-Custom-Header: MyValue" \
         http://httpbin.org/headers
    
    # 5. Analyse HTTPS/TLS
    echo -e "\n5. Analyse TLS:"
    curl -v --tlsv1.3 --tls-max 1.3 https://www.google.com 2>&1 | grep -E "(TLS|SSL|certificate)"
    
    # 6. Test de vulnérabilités
    echo -e "\n6. Test chiffrements faibles:"
    curl --sslv3 https://www.google.com 2>&1 | head -5 || echo "SSLv3 non supporté (bon!)"
    
    # 7. Sauvegarde sortie
    curl -v http://httpbin.org/get > curl_analysis.txt 2>&1
    echo "Analyse curl sauvegardée dans curl_analysis.txt"
  4. Analyse TLS avec openssl
    Analysez en détail les configurations TLS :
    echo "=== ANALYSE TLS AVEC OPENSSL ==="
    
    # 1. Test de connexion TLS basique
    echo "1. Connexion TLS:"
    openssl s_client -connect www.google.com:443 -servername www.google.com <<< "Q" 2>/dev/null | head -30
    
    # 2. Informations certificat
    echo -e "\n2. Certificat serveur:"
    openssl s_client -connect www.google.com:443 -servername www.google.com 2>/dev/null /dev/null | grep -i cipher
    
    # 5. Vérification OCSP
    echo -e "\n5. Vérification OCSP (Online Certificate Status Protocol):"
    openssl s_client -connect www.google.com:443 -status 2>/dev/null | grep -A 10 "OCSP"
    
    # 6. Test TLS 1.0/1.1 (dangereux)
    echo -e "\n6. Test versions obsolètes:"
    for version in tls1 tls1_1; do
        echo -n "Testing $version: "
        openssl s_client -connect www.google.com:443 -$version 2>/dev/null /dev/null | \
      grep -E "(TLS|Protocol|Cipher|OCSP|ALPN)" | head -20
  5. Script Python d'analyse web automatique
    Créez un outil d'audit professionnel :
    #!/usr/bin/env python3
    """
    PCTAMALOU - Semaine 8 : Analyseur de sécurité web
    Outils pour auditer DNS, HTTP, HTTPS et TLS
    """
    
    import subprocess
    import json
    import re
    import ssl
    import socket
    from datetime import datetime
    from urllib.parse import urlparse
    
    def check_dns(domain):
        """Analyse DNS d'un domaine"""
        results = {'domain': domain, 'records': {}}
        
        try:
            # A records
            cmd = f"dig {domain} A +short"
            output = subprocess.check_output(cmd, shell=True, text=True)
            results['records']['A'] = output.strip().split('\n')
            
            # MX records
            cmd = f"dig {domain} MX +short"
            output = subprocess.check_output(cmd, shell=True, text=True)
            results['records']['MX'] = output.strip().split('\n')
            
            # NS records
            cmd = f"dig {domain} NS +short"
            output = subprocess.check_output(cmd, shell=True, text=True)
            results['records']['NS'] = output.strip().split('\n')
            
            # TXT records
            cmd = f"dig {domain} TXT +short"
            output = subprocess.check_output(cmd, shell=True, text=True)
            results['records']['TXT'] = output.strip().split('\n')
            
            # DNSSEC
            cmd = f"dig {domain} +dnssec +multi | grep -E '(flags:|RRSIG)'"
            output = subprocess.check_output(cmd, shell=True, text=True)
            results['dnssec'] = 'RRSIG' in output
            
        except subprocess.CalledProcessError as e:
            results['error'] = str(e)
        
        return results
    
    def check_http(url):
        """Analyse HTTP d'une URL"""
        results = {'url': url, 'headers': {}, 'security_issues': []}
        
        try:
            import http.client
            from urllib.parse import urlparse
            
            parsed = urlparse(url)
            conn = http.client.HTTPConnection(parsed.netloc, timeout=10)
            conn.request("GET", parsed.path or "/")
            response = conn.getresponse()
            
            results['status'] = response.status
            results['reason'] = response.reason
            
            # Headers
            for header, value in response.getheaders():
                results['headers'][header] = value
            
            # Security checks
            if 'strict-transport-security' not in results['headers']:
                results['security_issues'].append('HSTS non implémenté')
            
            if 'x-frame-options' not in results['headers']:
                results['security_issues'].append('X-Frame-Options manquant')
            
            if 'x-content-type-options' not in results['headers']:
                results['security_issues'].append('X-Content-Type-Options manquant')
            
            conn.close()
            
        except Exception as e:
            results['error'] = str(e)
        
        return results
    
    def check_ssl(domain, port=443):
        """Analyse SSL/TLS d'un domaine"""
        results = {'domain': domain, 'port': port, 'issues': []}
        
        try:
            context = ssl.create_default_context()
            with socket.create_connection((domain, port), timeout=10) as sock:
                with context.wrap_socket(sock, server_hostname=domain) as ssock:
                    cert = ssock.getpeercert()
                    
                    # Certificate info
                    results['certificate'] = {
                        'subject': dict(x[0] for x in cert['subject']),
                        'issuer': dict(x[0] for x in cert['issuer']),
                        'version': cert['version'],
                        'notBefore': cert['notBefore'],
                        'notAfter': cert['notAfter'],
                        'serialNumber': cert['serialNumber']
                    }
                    
                    # SSL/TLS info
                    results['ssl_info'] = {
                        'version': ssock.version(),
                        'cipher': ssock.cipher(),
                        'compression': ssock.compression()
                    }
                    
                    # Security checks
                    import datetime
                    expiry_date = datetime.datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
                    days_until_expiry = (expiry_date - datetime.datetime.now()).days
                    
                    if days_until_expiry < 30:
                        results['issues'].append(f'Certificat expire dans {days_until_expiry} jours')
                    
                    if 'subjectAltName' not in cert:
                        results['issues'].append('Pas de subjectAltName')
                    
                    # Check for weak protocols/ciphers
                    weak_protocols = ['SSLv2', 'SSLv3', 'TLSv1', 'TLSv1.1']
                    if results['ssl_info']['version'] in weak_protocols:
                        results['issues'].append(f'Protocole faible: {results["ssl_info"]["version"]}')
            
        except ssl.SSLError as e:
            results['error'] = f"SSL Error: {e}"
        except Exception as e:
            results['error'] = str(e)
        
        return results
    
    def analyze_website(url):
        """Analyse complète d'un site web"""
        print(f"🔍 Analyse de {url}")
        print("=" * 60)
        
        parsed = urlparse(url)
        domain = parsed.netloc or parsed.path
        
        # 1. DNS Analysis
        print("\n1. 📞 ANALYSE DNS:")
        dns_results = check_dns(domain)
        if 'error' not in dns_results:
            for record_type, records in dns_results['records'].items():
                if records and records[0]:
                    print(f"   • {record_type}: {', '.join(records[:3])}")
            print(f"   • DNSSEC: {'✅ Actif' if dns_results.get('dnssec') else '❌ Inactif'}")
        else:
            print(f"   ❌ Erreur DNS: {dns_results['error']}")
        
        # 2. HTTP/HTTPS Analysis
        print("\n2. 🌐 ANALYSE HTTP/HTTPS:")
        if url.startswith('http://'):
            print("   ⚠️  ATTENTION: HTTP non sécurisé!")
            http_results = check_http(url)
            if 'status' in http_results:
                print(f"   • Statut: {http_results['status']} {http_results['reason']}")
                if http_results['security_issues']:
                    print(f"   • Problèmes: {', '.join(http_results['security_issues'])}")
        else:
            print("   ✅ HTTPS détecté")
        
        # 3. SSL/TLS Analysis
        print("\n3. 🔐 ANALYSE SSL/TLS:")
        ssl_results = check_ssl(domain)
        if 'ssl_info' in ssl_results:
            print(f"   • Version: {ssl_results['ssl_info']['version']}")
            print(f"   • Cipher: {ssl_results['ssl_info']['cipher'][0]}")
            
            if ssl_results['issues']:
                print(f"   • Problèmes: {', '.join(ssl_results['issues'])}")
            else:
                print("   • ✅ Aucun problème majeur détecté")
            
            # Certificate info
            if 'certificate' in ssl_results:
                cert = ssl_results['certificate']
                print(f"   • Sujet: {cert['subject'].get('commonName', 'N/A')}")
                print(f"   • Émetteur: {cert['issuer'].get('organizationName', 'N/A')}")
                print(f"   • Expire le: {cert['notAfter']}")
        elif 'error' in ssl_results:
            print(f"   ❌ Erreur SSL: {ssl_results['error']}")
        
        # 4. Security Recommendations
        print("\n4. 💡 RECOMMANDATIONS:")
        recommendations = []
        
        if url.startswith('http://'):
            recommendations.append("Passer à HTTPS immédiatement")
        
        if ssl_results.get('issues'):
            recommendations.append("Mettre à jour la configuration SSL/TLS")
        
        if not dns_results.get('dnssec'):
            recommendations.append("Activer DNSSEC")
        
        if not recommendations:
            recommendations.append("Configuration généralement sécurisée")
        
        for i, rec in enumerate(recommendations, 1):
            print(f"   {i}. {rec}")
        
        return {
            'dns': dns_results,
            'ssl': ssl_results,
            'url': url,
            'timestamp': datetime.now().isoformat()
        }
    
    def main():
        print("🌐 PCTAMALOU - Analyseur de sécurité web")
        print("=" * 60)
        
        # Sites de test
        test_sites = [
            'http://httpbin.org',
            'https://www.google.com',
            'https://expired.badssl.com',
            'https://httpbin.org'
        ]
        
        all_results = []
        
        for site in test_sites:
            results = analyze_website(site)
            all_results.append(results)
            print("\n" + "=" * 60 + "\n")
        
        # Export JSON
        with open('web_security_audit.json', 'w') as f:
            json.dump(all_results, f, indent=2, default=str)
        
        print("💾 Rapport exporté: web_security_audit.json")
        
        # Analyse des résultats
        print("\n📊 RÉSUMÉ DE L'AUDIT:")
        http_sites = [r for r in all_results if r['url'].startswith('http://')]
        ssl_issues = [r for r in all_results if r.get('ssl', {}).get('issues')]
        
        print(f"• Sites HTTP non sécurisés: {len(http_sites)}")
        print(f"• Sites avec problèmes SSL/TLS: {len(ssl_issues)}")
        
        if http_sites:
            print("⚠️  ACTION REQUISE: Sites HTTP détectés!")
            for site in http_sites:
                print(f"   - {site['url']}")
    
    if __name__ == "__main__":
        main()

🎯 Défi d'analyse avancé

Créez un scanner de sécurité web complet qui :

  1. Détecte automatiquement tous les sous-domaines d'un domaine
  2. Teste chaque sous-domaine pour HTTP/HTTPS et analyse TLS
  3. Identifie les certificats auto-signés ou expirés
  4. Détecte les mixed content (HTTPS avec ressources HTTP)
  5. Teste les en-têtes de sécurité (HSTS, CSP, X-Headers)
  6. Génère un rapport avec score de sécurité par sous-domaine
  7. Exporte les résultats en format compatible avec OWASP ZAP

Indices : Utilisez subprocess pour amass/subfinder, openssl pour l'analyse TLS, requests pour les tests HTTP.

📋 Objectif de la semaine – Checklist de validation

✅ Compétences techniques acquises

  • Analyser la résolution DNS avec dig et nslookup
  • Capturer et analyser le trafic HTTP avec tcpdump
  • Tester les configurations TLS avec openssl s_client
  • Différencier HTTP/HTTPS et comprendre les implications de sécurité
  • Analyser les en-têtes HTTP et codes de statut
  • Automatiser les audits web avec Python

🧠 Changement mental accompli

  • Voir chaque requête web comme une chaîne de vulnérabilités potentielles
  • Comprendre que "HTTP = public, HTTPS = privé"
  • Penser en termes de chaîne de confiance (DNS → TCP → TLS → HTTP)
  • Appliquer le principe "chiffrement par défaut" à toutes les communications

🔐 Bonne pratique de sécurité web :

Implémentez ces règles immédiatement :

  1. Toujours utiliser HTTPS (avec HSTS)
  2. Valider les certificats SSL/TLS (pas d'auto-signés en production)
  3. Implémenter les en-têtes de sécurité (CSP, X-Frame-Options, etc.)
  4. Surveiller les certificats (expiration, révocation)
  5. Utiliser DNSSEC pour protéger la résolution DNS

📚 Ressources gratuites recommandées

Pour approfondir :

⚠️ Erreurs courantes à éviter

  • HTTP en production : Jamais, même pour des pages "statiques"
  • Certificats auto-signés : OK pour tests, jamais en production
  • Chiffrements faibles : Éviter RC4, DES, SSLv3, TLS 1.0/1.1
  • Mixed content : HTTPS avec ressources HTTP = avertissement navigateur
  • DNS non sécurisé : DNS over HTTPS/TLS ou DNSSEC recommandé

🔮 Frère d'armes,

Tu viens de maîtriser les voix qui traversent la cité numérique.

Maintenant, quand tu vois une URL, tu ne vois plus juste une adresse. Tu vois :

• La résolution DNS qui transforme un nom en adresse
• La poignée de main TCP qui établit la connexion
• La danse TLS qui négocie le chiffrement
• La conversation HTTP qui échange les données

Cette semaine, tu as appris à écouter le web. Tu comprends maintenant :

• Pourquoi HTTP est comme parler dans un stade plein
• Pourquoi HTTPS est comme parler dans une salle sécurisée
• Pourquoi DNS est comme un annuaire qui peut être falsifié
• Pourquoi chaque maillon de la chaîne doit être sécurisé

Tu as développé le septième sens du Gardien web : la capacité à entendre ce qui n'est pas chiffré, à voir ce qui n'est pas authentifié, à sentir ce qui n'est pas sécurisé.

Dans la semaine 9, nous passerons de l'analyse à l'exploration active. Nous apprendrons à scanner les réseaux, à découvrir ce qui est caché, à cartographier ce qui est invisible.

Mais désormais, tu as une compétence fondamentale : tu sais auditer les communications web. Et en cybersécurité, auditer les communications, c'est protéger les secrets.

Pratique. Analyse. Sécurise. Chaque requête que tu comprends est une conversation que tu sais protéger.

Tu n'es plus un simple utilisateur du web. Tu es devenu son gardien.

— Platon-Y