30 lines
9.3 KiB
JavaScript
30 lines
9.3 KiB
JavaScript
// Approfondissements premium (partie 3)
|
||
window.CONTENUS_PLUS = Object.assign(window.CONTENUS_PLUS || {}, {
|
||
python: {
|
||
cm: [{ t: 'Gérer les erreurs : try / except', d: '15 min', html: 'Une saisie invalide ne doit pas faire planter le programme. On capture l’exception attendue et on réagit.', exemple: 'while True:\n try:\n note = float(input("Note : "))\n break\n except ValueError:\n print("Entrez un nombre, par exemple 12.5")' },
|
||
{ t: 'Lire et écrire des fichiers', d: '15 min', html: 'Le mot-clé <code>with</code> ouvre un fichier et le referme automatiquement. Le module <code>csv</code> lit un tableur exporté.', exemple: 'import csv\nwith open("notes.csv", encoding="utf-8") as f:\n for ligne in csv.DictReader(f, delimiter=";"):\n print(ligne["nom"], ligne["note"])' },
|
||
{ t: 'Bonnes pratiques professionnelles', d: '10 min', html: 'Noms explicites, fonctions courtes qui font une seule chose, docstrings, tests avec <code>assert</code> ou pytest, respect de la PEP 8, versionnement avec Git.' }],
|
||
cas: { titre: 'Mise en situation · Automatiser un bilan de notes', texte: 'Un enseignant exporte chaque trimestre ses notes en CSV. Le script Python lit le fichier, calcule moyenne, médiane et écart-type par élève, repère ceux sous 8 et génère un rapport texte prêt pour le conseil de classe. 20 minutes de travail manuel deviennent 2 secondes.' },
|
||
erreurs: ['Mélanger tabulations et espaces', 'Oublier de convertir input() en nombre', 'Modifier une liste pendant qu’on la parcourt', 'Utiliser = au lieu de == dans une condition'],
|
||
qcm: [['Quelle exception lève float("abc") ?', ['TypeError', 'ValueError', 'KeyError', 'IndexError'], 1, 'La valeur ne peut pas être convertie.'], ['Pourquoi utiliser with open(...) ?', ['C’est plus rapide', 'Le fichier est refermé automatiquement', 'Obligatoire en Python 3', 'Pour chiffrer'], 1, 'Même en cas d’erreur.'], ['Quel est le rôle d’une docstring ?', ['Accélérer', 'Documenter la fonction', 'Tester', 'Commenter une ligne'], 1, 'Elle s’affiche avec help().']],
|
||
examen: { titre: 'Sujet type · 1 h · 20 points', q: ['Écrire saisir_note() qui redemande tant que la saisie n’est pas un nombre entre 0 et 20. (5 pts)', 'Écrire moyenne(l) et ses 2 tests. (4 pts)', 'Lire notes.csv et afficher les élèves sous 8. (6 pts)', 'Trouver et corriger 3 erreurs dans un programme fourni. (5 pts)'], r: ['while True + try/except + test 0 ≤ n ≤ 20', 'return sum(l)/len(l) ; assert …', 'csv.DictReader + float(ligne["note"]) < 8', 'Selon le programme fourni'] },
|
||
prof: { deroule: [['0-10 min', 'Démonstration : un script qui fait le bilan de la classe'], ['10-50 min', 'CM variables, conditions'], ['50-120 min', 'TP IDE avec tests automatiques'], ['Séance 2', 'Boucles, fonctions'], ['Séance 3', 'Fichiers, erreurs, sujet type']], diff: 'Difficulté : exercices à trous et indices progressifs. Avancés : HackerRank Python, projet de bilan CSV.', eval: 'Tests IDE, projet noté, sujet type.' } },
|
||
web: {
|
||
cm: [{ t: 'Rendre une page dynamique avec JavaScript', d: '20 min', html: 'JavaScript s’exécute dans le navigateur et modifie la page (le DOM) en réaction aux actions de l’utilisateur.', exemple: '<button id="b">Lever la main</button>\n<script>\n document.getElementById("b").addEventListener("click", () => {\n alert("Le prof est prévenu");\n });\n</script>' },
|
||
{ t: 'Sécurité web : les bases', d: '20 min', html: 'Les failles les plus courantes (OWASP Top 10) : injection SQL, <b>XSS</b> (script injecté dans une page), contrôle d’accès défaillant, configurations par défaut. Réponses : valider les entrées, échapper les sorties, HTTPS partout, mises à jour, en-têtes de sécurité.', attention: 'Afficher tel quel un commentaire saisi par un visiteur permet d’exécuter son script chez tous les autres visiteurs : c’est une XSS.' },
|
||
{ t: 'Virtual hosts et HTTPS sous Apache', d: '15 min', html: 'Un même serveur héberge plusieurs sites grâce aux <i>virtual hosts</i>. Certbot obtient et renouvelle un certificat Let’s Encrypt.', exemple: 'sudo a2ensite intranet.conf\nsudo systemctl reload apache2\nsudo certbot --apache -d intranet.lycee.fr' }],
|
||
cas: { titre: 'Mise en situation · Intranet du BTS', texte: 'La section veut un intranet pour publier les plannings. Le technicien installe Apache sur une VM Debian, crée un virtual host intranet.lycee.fr, publie une page HTML/CSS, active HTTPS avec Let’s Encrypt, puis vérifie les journaux et teste depuis plusieurs navigateurs.' },
|
||
erreurs: ['Oublier la balise meta charset (accents cassés)', 'Confondre <title> et <h1>', 'Envoyer un mot de passe en GET', 'Modifier la configuration sans apachectl configtest'],
|
||
qcm: [['Qu’est-ce qu’une XSS ?', ['Un virus', 'L’injection d’un script dans une page vue par d’autres', 'Une panne DNS', 'Un certificat expiré'], 1, 'Cross-Site Scripting.'], ['Quelle commande vérifie la configuration d’Apache ?', ['apache2 --check', 'apachectl configtest', 'systemctl test apache2', 'a2ensite -t'], 1, 'À lancer avant chaque reload.'], ['Que fait certbot --apache ?', ['Installe Apache', 'Obtient et installe un certificat HTTPS', 'Crée un site', 'Chiffre les fichiers'], 1, 'Avec renouvellement automatique.']],
|
||
examen: { titre: 'Sujet type · 1 h · 20 points', q: ['Décrire une requête et une réponse HTTP complètes. (4 pts)', 'Écrire une page HTML valide avec titre, liste et formulaire. (6 pts)', 'Écrire le CSS d’une grille de 3 cartes. (4 pts)', 'Citer 3 mesures de sécurité pour un site. (6 pts)'], r: ['GET / Host … → 200 OK Content-Type …', 'doctype, lang, meta charset, h1, ul, form method=post', 'display: grid; grid-template-columns: repeat(3, 1fr)', 'HTTPS · échapper les sorties · requêtes préparées · mises à jour'] },
|
||
prof: { deroule: [['0-10 min', 'Ouvrir les outils de développement sur un vrai site'], ['10-50 min', 'CM HTTP et HTML'], ['50-120 min', 'Lab web : Apache + navigateur relié'], ['Séance 2', 'CSS, JavaScript, sécurité, sujet type']], diff: 'Difficulté : squelette HTML fourni. Avancés : freeCodeCamp, virtual hosts et HTTPS.', eval: 'Lab validé automatiquement, mini-site noté, sujet type.' } },
|
||
crypto: {
|
||
cm: [{ t: 'Certificats et PKI', d: '20 min', html: 'Un certificat lie une clé publique à une identité (un nom de domaine), signé par une <b>autorité de certification</b>. Le navigateur vérifie la chaîne jusqu’à une autorité racine de confiance, la date de validité et le nom.', exemple: 'openssl s_client -connect www.lycee.fr:443 -servername www.lycee.fr </dev/null \\\n | openssl x509 -noout -subject -issuer -dates' },
|
||
{ t: 'Attaques courantes', d: '15 min', html: '<b>Force brute</b> et <b>dictionnaire</b> sur les mots de passe, <b>bourrage d’identifiants</b> (réutilisation de mots de passe fuités), <b>hameçonnage</b>, <b>homme du milieu</b>. Parades : mots de passe longs et uniques, gestionnaire de mots de passe, authentification à deux facteurs.' },
|
||
{ t: 'Le cadre français', d: '10 min', html: 'L’<b>ANSSI</b> publie les recommandations techniques (tailles de clés, algorithmes). La <b>CNIL</b> encadre les mots de passe dans les services en ligne. Le <b>RGPD</b> impose de protéger les données personnelles, y compris par chiffrement.' }],
|
||
cas: { titre: 'Mise en situation · Audit des accès', texte: 'Après une tentative d’intrusion, la direction demande un audit. Le technicien vérifie que les mots de passe de l’application sont stockés en Argon2id, remplace l’accès SSH par mot de passe par des clés Ed25519, contrôle les certificats HTTPS et rédige des recommandations en citant l’ANSSI et la CNIL.' },
|
||
erreurs: ['Confondre chiffrer et hacher', 'Partager sa clé privée', 'Stocker un mot de passe en SHA-256 sans sel', 'Ignorer un avertissement de certificat'],
|
||
qcm: [['Qui signe un certificat HTTPS ?', ['Le navigateur', 'Une autorité de certification', 'Le FAI', 'La CNIL'], 1, 'L’AC atteste l’identité du domaine.'], ['Quelle parade contre le bourrage d’identifiants ?', ['Changer d’adresse IP', 'Un mot de passe unique par service et la double authentification', 'Désactiver HTTPS', 'Un antivirus'], 1, 'Un mot de passe fuité ne sert alors qu’une fois.'], ['Quel organisme publie les recommandations cryptographiques en France ?', ['CNIL', 'ANSSI', 'ARCEP', 'INRIA'], 1, 'L’ANSSI.']],
|
||
examen: { titre: 'Sujet type · 1 h · 20 points', q: ['Distinguer hachage, chiffrement symétrique et asymétrique, avec un usage chacun. (6 pts)', 'Expliquer comment stocker des mots de passe. (4 pts)', 'Décrire l’établissement d’une session HTTPS. (5 pts)', 'Proposer la configuration SSH d’un serveur exposé. (5 pts)'], r: ['intégrité · disques et sessions · échange et signature', 'Argon2id + sel unique + coût adapté', 'certificat → échange de clés → clé de session AES', 'clés Ed25519, PasswordAuthentication no, PermitRootLogin no, fail2ban'] },
|
||
prof: { deroule: [['0-15 min', 'Accroche : vérifier si son adresse a fuité (haveibeenpwned)'], ['15-60 min', 'CM hachage et mots de passe'], ['60-90 min', 'TD et démonstration openssl'], ['Séance 2', 'Asymétrique, HTTPS, lab SSH, sujet type']], diff: 'Difficulté : analogies (cadenas et clé). Avancés : Root-Me, analyse d’un certificat, attaque par dictionnaire avec hashcat sur un jeu d’essai.', eval: 'Lab SSH validé, sujet type sur 20.' } }
|
||
});
|